Проблема глубже, чем может показаться.Возможно, вы неправильно понимаете, что делает оператор return
внутри forEach
.Код структурирован так, как если бы предполагалось, что он проверяет, является ли какой-либо из doc.exists
ложным, и возвращает ли он раньше, если это так, но если записать его так, он вернется из обратного вызова итерации ... и поскольку forEach
не используетвозвращаемое значение обратного вызова, отклонение обещания остается необработанным.
Правильными способами достижения этого результата являются следующие:
1) Просто проверьте непосредственно то, что вам нужно проверить:
if (docs.findIndex(doc => !doc.exists) !== -1) {
return Promise.reject("Product deleted");
}
2) Используйте цикл for..in
или for..of
вместо forEach
:
for (doc of docs) {
if (!doc.exists) {
return Promise.reject("Product deleted")
}
}
3) Используйте результат map
и await
(не рекомендуется, поскольку выдействительно не нужно отображать):
await Promise.all(docs.map(doc => {
if (!doc.exists) {
return Promise.reject("Product deleted")
}
return null
})
Обратите внимание, что в этом случае любое отклоненное обещание внутри результирующего массива должно вызвать отклонение внешнего обещания.
Примечание:вам никогда не нужен явный вызов Promise.reject()
.Поскольку ваша функция асинхронная, вы можете просто throw
что-то использовать в качестве ошибки - это все равно будет преобразовано в отказ от обещания.