因此,基本上我发现,当您创建一个承诺数组并循环处理单个承诺时,承诺会同时解析...但是当您创建单个承诺和交易时,承诺将不起作用与他们循环...
所以基本上这个问题来自我玩axios的过程,我最初认为这是一个错误(https://github.com/axios/axios/issues/1973)。但是我很快发现,误解了Promise的某些部分(尤其是await Promise
)实际上是一个问题。但是,除非我错过了某些内容,否则我认为我无法在MDN文档中找到任何东西。
这将不起作用:
let results = [];
for (let i=1; i<=5; i++) {
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('foo');
}, 10000);
})
results.push(await promise);
}
但这将会:
let results = [];
const promises = [
new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('foo');
}, 10000);
}),
new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('foo');
}, 10000);
}),
new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('foo');
}, 10000);
}),
new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('foo');
}, 10000);
}),
new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('foo');
}, 10000);
}),
];
for (let i=1; i<=5; i++) {
results.push(await promises[i-1]);
}
在两种情况下,我都希望可以以并发方式解决一组诺言(results
)。
但是在第一个示例中,承诺实际上是一个接一个地解决的。
答案 0 :(得分:0)
好吧...我只是傻了...
第一种情况,我们通过循环创建了五个单独的Promise,当然,我们必须等到一个解决后再执行第二个循环。
第二种情况,我们首先创建诺言数组,因此它们开始并发运行。当我们循环遍历其中的5个时,实际上我们会在第一个循环中被阻塞,直到第一个promise解析完毕,然后剩下的4个循环便会立即结束(因为剩下的4个诺言将被解析)。
这仅仅是因为数组中同时存在5个Promise。