forEach
работает синхронно .Если вы хотите дождаться разрешения всех Обещаний до полного разрешения processInvoices
, вместо этого следует использовать Promise.all
;map
каждый номер счета к Promise
и вызов Promise.all
в результирующем массиве Обещаний.Кроме того, ваш
if (!result) {resolve(false);}
звучит так, как будто это попытка обработать ошибку, если результата нет - в этом случае вам следует отклонить Promise
вместо вызова resolve
.В идеале неудачный вызов confirmInvoice
приведет к отклонению Promise
, но если это не то, что вы можете исправить, выведите ошибку, если result
неверно, поэтому вы можете обработать ее в catch
в init
.Например:
function processInvoices(invoices) {
return Promise.all(
invoices.map(number => (
confirmInvoice(number)
.then(result => {
// This will result in the `Promise.all` rejecting:
if (!result) throw new Error('Failed to confirm invoice ' + number);
})
))
);
}
function init() {
const invoices = [2, 4, 8, 16, 31];
processInvoices(invoices)
.then(result => {
console.log('All invoices were processed');
})
.catch((err) => {
console.log('err: ' + err);
});
}