javascript - 如何同时发布多个axios请求?
问题描述
目前,我有一个网页,其中正在发出一长串 Axios POST 调用。现在,请求似乎是并行发送的(JavaScript 在收到结果之前继续发送下一个请求)。
但是,结果似乎是一个一个返回,而不是同时返回。假设对 PHP 脚本的一次 POST 调用需要 4 秒,而我需要进行 10 次调用。目前每次调用需要 4 秒,总共需要 40 秒。我希望找到一个解决方案并在大约相同的时间(约 4 秒)而不是约 40 秒收到所有结果。
现在我已经阅读了关于线程,NodeJS 中使用 Workers 的多线程。我读过 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!' );
}
解决方案
您可以通过三种情况实现您的目标。
对于 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) }));
你可以使用
Promise.allSettled()
. Promise.allSettled() 方法返回一个在所有给定的承诺都已解决或被拒绝后解决的承诺,您可以尝试使用
Promise.all()
,但它的缺点是,如果任何1 个请求失败,那么它将全部失败并将 o/p 作为错误(或在 catch 块中)
但最好的情况是第一个。
推荐阅读
- java - 更改实体注释类后出现 UnsatisfiedDependencyException
- mysql - 由于 mariadb 安装,Mysql 将无法安装但 mariadb 未安装
- java - 将方法移动到另一个 Java 类,并从原始类调用该方法
- javascript - NodeJS - 没有表达的会话处理
- quarkus - 图像堆中不允许...的实例,因为此类应在图像运行时初始化
- java - 如何在 Antlr4 中为零参数的函数编写语法
- c# - 一次将图像和数字数据添加到数据库的最佳方法是什么?
- python - 使用双 y 轴设置绘图的纵横比
- node.js - 如何在 Jest afterAll 挂钩中关闭 Express 服务器
- mysql - 我正在处理我的应用程序,但突然我的所有表中都不存在表