Обещания в обещании, а не в последовательности, используя каждый - PullRequest
0 голосов
/ 23 января 2019

Я использую библиотеку Bluebird Promise в скрипте узла, и у меня возникают проблемы с пониманием порядка выполнения кода.У меня есть массив Обещаний, что я использую метод .each, чтобы они выполнялись последовательно по порядку.В каждом из этих обещаний у меня есть два связанных обещания, но второе обещание не выполняется в ожидаемом порядке.

Если мы возьмем следующий код, я бы подумал, что результат будет 0.0, 0.1, 0.2, 1.0, 1.1, 1.2...так далее.Но это не похоже на случай.Он производит 0.0, 0.1, 1.0, 1.1, 0.2, 1.2 ... и т. Д.

function subPromise1(index)
{
    return new Promise(function (resolve, reject) {
        console.log(String(index) + ".1");
        resolve(index);
    });
}

function subPromise2(index)
{
    return new Promise(function (resolve, reject) {
        console.log(String(index) + ".2");
        resolve(index);
    });
}

var promiseArray = [];
for (var index = 0; index < 2; index++) {
    promiseArray.push(new Promise(function (resolve, reject) {
        console.log(String(index)+".0");
        subPromise1(index).then(subPromise2).then(function (result) {
            resolve(result);
        });
    }));
}

Promise.each(promiseArray, function (index) {
    console.log("Completed " + index);
}).then(function (result) {
    console.log(result);
    process.exit(0);
});

Я бы подумал, что главное "каждое" обещание должно быть разрешено перед выполнением следующего обещания в массиве?Буду очень признателен за любую помощь в понимании проблемы.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

В моем первоначальном мышлении я предполагал, что .each выполнял обещания, поскольку он повторял массив, что не соответствует действительности. Он делал их в for loop как они были созданы.

Второй параметр метода .each должен возвращать обещание для его выполнения в это время.

Promise.each(
    [ 0,1 ],
    function (index) {
        return new Promise(function (resolve, reject) {
            subPromise1(index).then(subPromise2).then(function (result) {
                console.log("Completed " + index);
                resolve(result);
            });
        })
    })
    .then(function (result) {
        console.log(result);
        process.exit(0);
    });
0 голосов
/ 23 января 2019

Проблема с циклом for и вызовом обещания внутри этого цикла. Цикл не ждет, когда обещание будет полностью решено. Если вы хотите использовать async / await, вы можете получить ожидаемый результат, используя приведенный ниже код.

let result = [];
let indexes = [0, 1];
(async () => {
  for (let index of indexes) {
    console.log(String(index) + ".0");
    const r1 = await subPromise1(index);
    const r2 = await subPromise2(r1);
    result.push(r2);
  }

  console.log(JSON.stringify(result));
})();
...