Есть участок, где я в цикле выпоняю промисы
.then(result => {
for (let t of article.tags) {
Tag.findOneAndUpdate({ _id: t }, {$push: {"articles": article._id}}, {new: true})
.then(tag => {
if (tag === null) throw new Error('Tag not found')
})
.catch(err => next(err))
}
})
Я рассчитывал, что если это условие выполняется, то все операции идущие за этим блоком then() также оборвутся. Но нет, выполняется следующий блок, даже если
if (tag === null) throw new Error('Tag not found')
.then(result => {
article.save()
.then(result => {
console.log(result)
res.status(201).json({
status: 'OK',
article
})
})
})
И в итоге я получаю
(node:8682) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
(node:8682) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:8682) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Т.е. заголовки отправляются два раза - сначала
throw new Error('Tag not found')
отправляет заголовки (это мой эррор хэндлер), потом следующий блок then()
Как сделать, чтоб если в цикле выполняется условие прерывать все остальное и выкидывать только ошибку и не выполнять код идущий ниже?
Плз, не предлагайте варианты с async/await (у меня есть рабочий код на них), хочу все на промисах (изучаю тему)