У меня есть код ниже, который я написал при выполнении модульных тестов в мокко для одной из моих функций. Я намеревался заполнить массив 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