Параллелизм в решении множества обещаний - PullRequest
0 голосов
/ 22 января 2019

Таким образом, в основном я обнаружил, что обещания разрешаются одновременно, когда вы создаете массив обещаний и работаете с отдельными обещаниями в цикле ... Но это не работает, когда вы создаете индивидуальные обещания и имеете дело сони в цикле ...

Таким образом, в основном этот вопрос возник из-за того, что я играл с 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 голосов
/ 22 января 2019

Хорошо ... Я просто был глупым ...

В первом случае мы создаем пять отдельных обещаний с помощью циклов, конечно, мы должны подождать, пока одно из них не решится, прежде чем выполнять второй цикл.

Во втором случае мы сначала создаем массив обещаний, поэтому они запускаются одновременно. Когда мы перебираем 5 из них, мы фактически блокируемся в первом цикле, пока не решится первое обещание, остальные 4 цикла будут завершены в любой момент (поскольку остальные 4 обещания будут разрешены).

Это только потому, что 5 обещаний выполняются одновременно в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...