Что происходит в этих цепочечных обещаниях? - PullRequest
1 голос
/ 12 марта 2019

У меня есть код ниже, который я написал при выполнении модульных тестов в мокко для одной из моих функций. Я намеревался заполнить массив courseAddress некоторыми значениями, которые я получаю из асинхронной функции.

Я знаю, что есть гораздо более элегантный способ написания теста ниже, напрямую возвращая массив allPromises внутри 4-го оператора then, но я что-то пробовал и обнаружил некоторую особенность.

Предполагается, что сначала выполняется цикл for и заполняется allPromises ожидающими обещаниями, а затем должен выполняться Promise.all, чья then будет обработана, только когда все обещания в allPromises разрешены ( или некоторые отклонили).

Выходной код, который я получаю снизу:

0x0000000000000000000000000000000000000000
0x0000000000000000000000000000000000000000
0x0000000000000000000000000000000000000000

но вместо этого я ожидаю ненулевые значения.

Почему это происходит? console.log(e) должен работать только тогда, когда все Обещания внутри allPromises были разрешены, и по выводу можно с уверенностью сказать, что в массиве allPromises было три элемента.

let addCoursePromises = [];    // array of Promises stored by some other function
let courseAddress = [];        // array of strings

it("get the contract addresses of all Course contracts", () => {
    let instance;
    return Manager.deployed()
        .then(inst => instance = inst)
        .then(() => addCoursePromises)
        .then((arr) => Promise.all(arr))
        .then((resolves) => {
            let allPromises = [];
            for(let i = 730; i <= 732; i++) {
                allPromises.push(instance.getCourseAddress.call(i));
            }
            // return Promise.all(allPromises) works as expected, but this doesn't
            Promise.all(allPromises)
                .then(arr => {
                    arr.forEach(e => {
                        courseAddress.push(e);
                        console.log(e);
                    });
                })
                .catch(err => { 
                    throw err;
                })
        })
        .catch(err => {
            throw err;  
        })
}
);


РЕДАКТИРОВАТЬ: Вот полный код: https://github.com/mayanksha/blockchain/blob/c478b5d97d5a254a79dbe4d9b8f3eaad57c26fa5/a3/test/Manager_test.js#L421

...