@verycooldev

Как прервать выполнение цепочки промисов, если совпадает условие в цикле с промисами?

Есть участок, где я в цикле выпоняю промисы

.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 (у меня есть рабочий код на них), хочу все на промисах (изучаю тему)
  • Вопрос задан
  • 666 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы