如何同时发布多个axios请求?

新手上路,请多包涵

此刻我有一个网页,其中有一长串 Axios POST 调用。现在,请求似乎是并行发送的(JavaScript 在收到结果之前继续发送下一个请求)。

不过结果好像是一个一个返回的,不是同时返回的。假设对 PHP 脚本的一次 POST 调用需要 4 秒,而我需要进行 10 次调用。目前每次通话需要 4 秒,总共需要 40 秒。我希望找到两者的解决方案,并在大约同时(~4 秒)而不是~40 秒内收到所有结果。

现在我已经阅读了有关使用 Workers 的 NodeJS 中的线程和多线程的信息。我读过 JavaScript 本身只是单线程的,所以它本身可能不允许这样做。

但我不确定从这里去哪里。我只有一些想法。我不确定我是否正朝着正确的方向前进,如果我是,我不确定如何在 NodeJS 中使用 Workers 并将其应用到我的代码中。我应该走哪条路?任何指导将不胜感激!

这是一小段示例代码:

 for( var i = 0;  i < 10;  i++ )
{
    window.axios.post(`/my-url`, {
        myVar: 'myValue'
    })
    .then((response) => {
        // Takes 4 seconds, 4 more seconds, 4 more seconds, etc
        // Ideally: Takes 4 seconds, returns in the same ~4 seconds, returns in the same ~4 seconds, etc
        console.log( 'Succeeded!' );
    })
    .catch((error) => {
        console.log( 'Error' );
    });

    // Takes < 1 second, < 1 more second, < 1 more second, etc
    console.log( 'Request sent!' );
}

原文由 Z0q 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 598
2 个回答

通过三种情况你可以实现你的目标。

  1. 对于使用 Axios 的同时请求,您可以使用 Axios.all()
     axios.all([
      axios.post(`/my-url`, {
        myVar: 'myValue'
      }),
      axios.post(`/my-url2`, {
        myVar: 'myValue'
      })
    ])
    .then(axios.spread((data1, data2) => {
      // output of req.
      console.log('data1', data1, 'data2', data2)
    }));

  1. 您可以使用 Promise.allSettled() 。 Promise.allSettled() 方法返回一个承诺,该承诺在所有给定的承诺都已解决或拒绝后解决,

  2. 您可以尝试使用 Promise.all() 但它的缺点是,如果任何 1 个 请求失败,那么它将全部失败并给出 o/p 作为错误(或在 catch 块中)

但最好的情况是第一个。

原文由 Harsh Patel 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于 Axios 的同时请求,您可以使用 Axios.all()。

 axios.all([
  axios.get('https://api.github.com/users/MaksymRudnyi'),
  axios.get('https://api.github.com/users/taylorotwell')
])
.then(axios.spread((obj1, obj2) => {
  // Both requests are now complete
  console.log(obj1.data.login + ' has ' + obj1.data.public_repos + ' public repos on GitHub');
  console.log(obj2.data.login + ' has ' + obj2.data.public_repos + ' public repos on GitHub');
}));

此外,您还可以使用 Promise.all()。工作类似:

 Promise.all([
  fetch('https://api.github.com/users/MaksymRudnyi'),
  fetch('https://api.github.com/users/taylorotwell')
])
.then(async([res1, res2]) => {
  const a = await res1.json();
  const b = await res2.json();
  console.log(a.login + ' has ' + a.public_repos + ' public repos on GitHub');
  console.log(b.login + ' has ' + b.public_repos + ' public repos on GitHub');
})
.catch(error => {
  console.log(error);
});

但是,对于 Promise.all() 有一个特定的行为。如果至少有一个请求被拒绝——所有请求都将被拒绝,代码将转到 .catch() 部分。如果您需要确保所有请求都得到解决,这没关系。

如果您的某些请求被拒绝是可以的,请考虑使用 Promise.allSettled()。 Promise.allSettled() 方法返回一个承诺,该承诺在所有给定的承诺都已解决或拒绝后解决,并带有一个对象数组,每个对象描述每个承诺的结果。

原文由 Maksym Rudnyi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题