Javascript 承诺。所有如何确保所有承诺都可用?
我从Axios AJAX库中获取了这个示例,但是Javascript 承诺。所有如何确保所有承诺都可用?,javascript,ajax,promise,axios,Javascript,Ajax,Promise,Axios,我从Axios AJAX库中获取了这个示例,但是Promises.all()也是如此 到目前为止,我已经了解到,您可以使用promissions.all()检查一系列承诺中的所有承诺是否都已得到解决 这真的很好,但是如果你推动一个承诺,并且它在下一个承诺被推动之前就解决了,会发生什么呢 我猜测,我的平均AJAX调用开销至少为50ms,推送总是在任何AJAX请求之前发生,但仅仅说这是理所当然的并不是真的感觉正确 我可以想到两种解决方案: 使用计数来确保两个(在本例中)AJAX请求都在 数组 检查是
Promises.all()
也是如此
到目前为止,我已经了解到,您可以使用promissions.all()
检查一系列承诺中的所有承诺是否都已得到解决
这真的很好,但是如果你推动一个承诺,并且它在下一个承诺被推动之前就解决了,会发生什么呢
我猜测,我的平均AJAX调用开销至少为50ms,推送总是在任何AJAX请求之前发生,但仅仅说这是理所当然的并不是真的感觉正确
我可以想到两种解决方案:
数组
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(function (acct, perms) {
// Both requests are now complete
}));
它返回一个承诺,该承诺在iterable参数中的所有承诺都已解决时解决
Axios.spread
将从getUserAccount
和getUserPermission
获取解析值。推送是一种同步操作,ajax是异步的。JS将始终在运行任何异步操作之前运行所有同步操作,即使它已经完成。例如:
for (i=0;i<10000000;i++){
console.log('looping');
}
setTimeout(function(){
console.log('running async')
}, 0)
for(i=0;i您不必担心在传递给Promise之前解析的承诺。all
:Promise。在其(array)参数完全求值之前,不会调用all
。只有当数组准备就绪时,才会调用Promise.all
在Promise.all
被调用时,这些承诺是否已经被解析并不重要。Promise.all
将检查哪些承诺处于已解析状态,并且仅在所有承诺都已实现时调用其然后
方法。甚至可能数组中的所有承诺都是L已经履行:没问题,只要承诺。所有的都执行了,它会安排然后方法的执行。即使这些承诺已经解决的时间也无关紧要。即使它们在一小时前解决了,承诺。所有的都会正确地完成它的工作。不太清楚什么是你是在问。你是在动态地构建承诺数组吗?或者你想知道请求是否会在包装之前以某种方式完成吗?是的,这些承诺是从多个地方推送的。假设一个承诺被推送,而我预期会有两个承诺,那么理论上这个承诺可能会触发一个新的承诺第二个已经被推了?如果是这样的话,需要有一个机制来事先检查这个不?你不需要一个机制来事先检查这个。承诺。所有的
都从一系列承诺中做出了一个承诺。你怎么说他们是从不同的地方推出来的呢这是正确的,承诺。all()
是处理多个AJAX请求的一个极好的解决方案。黄金答案就在这里。虽然异步和同步的解释是正确的,但这并不是为什么要首先计算推送
的原因:这是因为这是JavaScript中正确的计算顺序:一个参数(在本例中为数组)必须在函数(向其传递此参数,即Promise.all
)执行(也同步)之前首先完全求值。因此,这与异步代码没有什么关系。我不想检查承诺是否已解决,因为此信息包含在承诺中,并且确实promise。all()
将为我检查此问题。我想确保Promises.all()
不会在我可能没有在我的数组中推送我想要的所有承诺时触发。但是根据@fatman的回答,推送的同步
操作总是在任何异步
请求触发之前发生。所以我想这不再是一个问题。不过感谢你的洞察力,谢谢你。你的arr当您将ay传递给Promise.all
时,ay将完成。我的观点是,无法将不完整的数组传递给Promise.all
(当然,除非您是有意这样做的,并且在调用Promise.all
后修改数组).JavaScript总是在调用传递参数的函数之前首先计算参数。好的,解释器会检查整个代码,并准确地知道最后一项何时被推送到这个数组上。因此,它知道参数已被完全计算,并确保只调用Promise.all
这一点?我猜整个async/sync
的故事仍然适用于这里,但在此之前所做的评估?这很难理解,因为我不知道解释器在push语句完成评估后是如何决定的。如果你的问题不包括使用push
反编码。相反,您有一个具有两个值的数组文本。我要说的是,JavaScript引擎将首先计算每个数组元素(从左到右),计算为两个承诺,然后将这两个值包装到一个数组中,然后调用Promise.all
。此原则与Promise.all
无关。这与a=[].concat([1+1,5-3,8*2])相同
:首先完成算术运算,然后使用这些结果创建数组,然后执行concat
。True。在我的代码示例中,我有两个值,但在我的代码库中,这将是一个空数组,组件将把它们的承诺推入其中,因此将没有初始数组元素。我是