并发解决一系列承诺

时间:2019-01-22 11:49:43

标签: javascript concurrency es6-promise

因此,基本上我发现,当您创建一个承诺数组并循环处理单个承诺时,承诺会同时解析...但是当您创建单个承诺和交易时,承诺将不起作用与他们循环...

所以基本上这个问题来自我玩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)。

但是在第一个示例中,承诺实际上是一个接一个地解决的。

1 个答案:

答案 0 :(得分:0)

好吧...我只是傻了...

第一种情况,我们通过循环创建了五个单独的Promise,当然,我们必须等到一个解决后再执行第二个循环。

第二种情况,我们首先创建诺言数组,因此它们开始并发运行。当我们循环遍历其中的5个时,实际上我们会在第一个循环中被阻塞,直到第一个promise解析完毕,然后剩下的4个循环便会立即结束(因为剩下的4个诺言将被解析)。

这仅仅是因为数组中同时存在5个Promise。