Promises.all 如何确保所有 have promise 都可用?

Promises.all how to ensure all have promises are available?

我从 Axios AJAX 库中获取了这个示例,但 Promises.all().

也是如此

到目前为止,我了解到您可以使用 Promises.all() 来检查一组 promises 中的所有 promises 是否都已解决。

这真的很好,但是如果你推送一个 promise 并且它在下一个推送之前解决了会发生什么?

我猜测我的平均 AJAX 调用的开销至少为 50 毫秒,推送将始终在任何 ajax 请求之前发生,但只是说认为这是理所当然的感觉并不正确.

我可以想到 2 个解决方案:

  1. 使用计数来确保两个(在这种情况下)AJAX 请求都在
    数组.

  2. 检查实际的函数名称。

其他人如何处理这个问题,或者大多数人是否只是满足于在单个请求得到足够快的解决之前推送两个 AJAX 请求的希望。

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

Axios.all calls Promise.all 其中 returns 一个单一的 promise 解决了 当可迭代参数中的所有 promise 都被解决时.

Axios.spread 将从 getUserAccountgetUserPermission.

获取解析值

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

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

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

虽然超时设置为0,所以它可以立即运行,它会等到for循环完成,然后才运行异步操作。

因此,即使您推送一个 promise 并且它立即解析,它也会等到推送完成,然后才会对已解析的 promise 做出反应。

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

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