Я все еще новичок в Обещаниях и асинхронном кодировании в JavaScript.Я пытаюсь создать функцию, которая возвращает обещание, которое проходит через массив объектов с setTimeout
.На каждом элементе я передам его другой функции, которая возвращает Promise.Если элемент не удовлетворяет условию, я помещаю его в другой массив и передаю этот новый массив в функцию для рекурсивного вызова еще 10 раз, пока он не удовлетворяет условию.Вот код:
const promiseFunc = (item) => {
return new Promise((resolve, reject) => {
// Do something
if (some_kind_of_error) {
return reject(the_error);
} else {
return resolve({
itemName: item.name,
status: (item.isComplete === 'complete')
});
}
});
};
const func2 = (listOfItems, count) => {
return new Promise((resolve, reject) => {
if (count > 10) {
reject(new Error("Too many attempts."));
}
setTimeout(() => {
const newList = [];
listOfItems.forEach(item => {
promiseFunc(item)
.then(result => {
if(result.isCompleted !== true) {
newList.push(item);
}
});
});
if (newList.length === 0) {
return resolve(true);
} else {
console.log('Calling func2 again');
return func2(newList, count+1);
}
}, 1000);
});
};
Проблема в том, что когда я запускаю функцию func2
, я всегда получаю true
, даже если предполагается повторение.
Когда я пыталсячтобы выйти из системы, я замечаю, что сообщение Calling func2 again
не было завершено в терминале.Это означает, что независимо от того, что условие проверки newList
всегда будет пустым, следовательно, оно всегда разрешает true
и никогда не обращается к оператору else
.
Может кто-нибудь объяснить, почему этотекущее поведение?Как мне сделать так, чтобы мой func2
ожидал выполнения if (newList.length === 0)
, пока не закончится мой цикл forEach
?