Promises.all如何确保所有承诺都可用?

时间:2017-09-13 08:05:27

标签: javascript ajax promise axios

我从Axios AJAX库中采用了这个例子,但同样适用于Promises.all()

到目前为止,我已经阅读过您可以使用Promises.all()来检查来自一系列承诺的所有承诺是否已经解决。

这真的很整洁,但是如果你推动一个承诺并且在推动下一个承诺之前它会解决会发生什么?

我猜测我的平均AJAX调用的开销至少为50ms,在任何ajax请求之前总是会发生推送,但只是说为了这个被授予的感觉并不是真的感觉正确。

我能想到有两个解决方案:

  1. 使用计数确保(在这种情况下)AJAX请求都在中 阵列

  2. 检查那里的实际功能名称。

  3. 其他人如何处理这个或者大多数人只是满足于希望两个AJAX请求被推送,然后才能足够快地解决单个请求。

    axios.all([getUserAccount(), getUserPermissions()])
      .then(axios.spread(function (acct, perms) {
        // Both requests are now complete
      }));
    

3 个答案:

答案 0 :(得分:1)

您无需担心在传递给Promise.all之前解析的promise:在完全评估其(数组)参数之前,不会调用Promise.all。只有在阵列准备就绪时,才会调用Promise.all

在调用Promise.all时,这些承诺是否已经解决,实际上并不重要。 Promise.all将检查哪些处于已解决状态,并且只有在满足所有这些方法时才会调用其then方法。甚至可能是 all 数组中的promises已经完成:没问题,只要执行Promise.all,它就会安排执行then方法。即使这些承诺已经解决的时间也无关紧要。即使它们在一小时前得到解决,Promise.all仍然可以正常工作。

答案 1 :(得分:0)

Axios.all calls Promise.all返回单个promise,当可迭代参数中的所有promise都被解析时解析

Axios.spread将从getUserAccountgetUserPermission获取已解析的值。

答案 2 :(得分:0)

Push是同步操作,ajax是异步。在运行任何异步操作之前,JS将始终运行所有同步操作,即使它已经完成。例如:

for (i=0;i<10000000;i++){
  console.log('looping');
}

setTimeout(function(){
  console.log('running async')
}, 0)

虽然超时设置为0,因此它可以立即运行,但它将等待for循环完成,然后才运行异步操作。

所以,即使你推出一个承诺并立即解决,它也会等到推送完成后才会对已解决的承诺做出反应。