2017-09-13 21 views
-2

我从Axios AJAX库中找到了这个例子,但是Promises.all()也是如此。Promises.all如何确保所有承诺都可用?

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

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

我猜测我的平均AJAX调用的开销至少为50毫秒,推送将始终发生在任何ajax请求之前,但只是说为此授予并不真正感觉正确。

这有2级的解决方案,我能想到的:

  1. 使用计数,以保证双方(在thise情况下)AJAX请求是
    阵列英寸

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

如何是别人处理这个或者是大多数人只是满足于这两个AJAX请求的希望推前一个人可以解决的速度不够快。

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

这是不是很清楚你问的。你是否在动态构建承诺数组?或者你想知道这些请求是否可以在包装之前完成? – Nit

+0

是的,这些承诺正从多个地方推出。比方说,一个单一的承诺一直在推动,而我期望2个承诺,那么在理论上这个承诺可能在第二个承诺被推之前触发一个承诺?如果是这种情况,那么需要有一种机制来事先检查这一点吗? –

+0

您不需要预先检查的机制。 'Promise.all'从一系列承诺中做出单一承诺。你是什​​么意思,他们被推到不同的地方 –

回答

1

您不必担心在传递到Promise.all之前解决的承诺:Promise.all在其(数组)参数完全评估之前不会被调用。只有当阵列准备好时,才会调用Promise.all

这些承诺中的任何一个是否已经解决,在时间Promise.all被调用时,并不重要。 Promise.all将检查哪些人处于已解决状态,并且只有在所有人都完成时才会调用其方法then。甚至可能是全部阵列中的承诺已经实现:没问题,只要执行Promise.all,它就会安排执行then方法。即使这些承诺已经解决的时间并不重要。即使他们在一小时前得到解决,Promise.all仍然会正常工作。

+0

我不想检查承诺是否已经解决,因为这些信息都包含在promise中,并且'Promise.all()'会为我检查。我想确保'Promises.all()'不会触发,因为我可能没有在我的数组中推送所有的promise。但根据@fatman的回答,'push'的'sync'操作总是会在任何'async'请求触发之前发生。所以我想这不再是一个问题。感谢您的洞察力,不胜感激。 –

+1

当你将它传递给'Promise.all'时,你的数组将会完成。我的观点是没有办法将一个不完整的数组传递给'Promise.all'(除非你当然这么做,并且在调用'Promise.all'后修改数组*)。在调用传递参数的函数之前,JavaScript总是先评估参数。 – trincot

+0

其实这个答案是正确的 – Tomer

0

Axios.all calls Promise.all它返回它解决当迭代参数中的所有承诺都解决一个承诺。

Axios.spread将从getUserAccountgetUserPermission获得解析值。

0

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

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

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

尽管超时设置为0,因此它可以立即运行,它会等到对循环完成,然后才运行异步操作。

因此,即使您推动承诺并立即解决,它也会等到推完后才会对已解决的承诺作出反应。

+0

哇,我会测试这一点,并阅读它。如果这是真的,那么'Promises.all()'是处理多个AJAX请求的绝妙解决方案。黄金答案就在那里。 –

+1

虽然异步和同步的解释是正确的,但这并不是为什么首先评估“push”的原因:这是因为这是JavaScript中正确的评估顺序:参数(在这种情况下是数组)必须先完成在函数(向其传递参数,即'Promise.all')之前进行评估(同步执行)。所以这与异步代码无关。 – trincot

相关问题