У меня необычное поведение.
В основном, как часть моего кода, у меня есть функция, которая использует вложенные циклы для построения обещания и добавления его в список обещаний.
После того, как вложенные циклы завершены, я хотел бы оценить список обещаний с помощью promise.all ().
В прошлом я успешно справлялся с одним циклом forEach. Вложенность, кажется, вызывает некоторые проблемы, а именно тестирование показывает, что Promise.all вызывается до завершения вложенного цикла forEach, в результате чегов нем вызывается пустой список и, следовательно, возвращается пустой список.
У меня такое ощущение, что проблема в том, что мне не хватает инструкции return где-то в моем вложенном цикле forEach, как упомянуто в этом ответе , но я не смог определить, где.
culprit.js const otherModule = require("blablabla")
const otherOtherModule = require("blablabla2")
function nestedFunction(list){
var promises = [];
list.forEach(element => {
otherModule.getSublist(element).then(sublist => {
sublist.forEach(subelement => {
promises.push(otherOtherModule.promiseResolvingFunction(subelement));
});
});
});
return Promise.all(promises);
}
module.exports = {
nestedFunction : nestedFunction
}
culprit.test.js const culprit = require("culpritpath")
// for mocking
const otherModule = require("blablabla")
otherModule.getSublist = jest.fn(() => Promise.resolve([{}, {}, {}]))
const otherOtherModule = require("blablabla2")
otherOtherModule.promiseResolvingFunction = jest.fn(() => Promise.resolve())
describe("nestedFunction()", ()=>{
it("returns an array of resolved promises", () => {
return culprit.nestedFunction([{}, {}]).then(res => {
expect(res).toHaveLength(6);
})
})
})
Вместо этого я получаю, что res
равно []
. Дальнейшие тесты показывают, что promiseResolvingFunction
вызывается нужное количество раз, поэтому, как я понимаю, Promise.all
вызывается до завершения вложенного цикла forEach.
PS: Я все еще начинаю с обещаниями и TDD, я более чем рад услышать отзывы о любом запахе кода.