打破承诺链 - 阻止下一个"然后"执行



我正在用Node/Express编写一个注册系统,我正在尝试使用Promises。

问题是我在使用它们时收到错误消息:

错误:

(节点:64725) 未处理的承诺拒绝警告:未处理的承诺拒绝(拒绝 ID:2):

有没有办法停在then

auth.isRegistered(email)
.then((registered) => {
    if ( !registered ) {
        req.flash('pleaseRegister', 'Looks like you haven't registered. Please register first.');
        req.session.user = user;
        res.redirect('/register')
    }
})
.then(() => {
    return auth.isVerified(email);
})
.then((verified) => {
    if ( !verified ) {
        console.log('please verify');
        res.redirect('/register/verify');
    } else {
        req.login(user, err => {
            if ( err ) return next(err);
            req.session.timestamp = Date.now();
            auth.updateLastLogin(email)
            .then(() => {
                res.redirect(req.session.returnTo || '/account');
            });
        });
    }
});

您可以执行以下操作:

    当您
  1. 想要打破承诺链时,抛出自定义错误。
  2. 签入catch引发错误的回调是自定义错误。如果是这样,请继续,否则使用error对象调用next

例:

let getBreackChainError = () => {
  let err = new Error();
  err.name = 'BreackChainError';
  return err;
};
auth
  .isRegistered(email)
  .then(registered => {
      if (!registered) {
        req.flash('pleaseRegister', 'Looks like you haven't registered. Please register first.');
        req.session.user = user;
        res.redirect('/register');
        throw getBreackChainError();
      }
      return auth.isVerified(email);
  })
  .then(verified => {
      if (!verified) {
        console.log('please verify');
        res.redirect('/register/verify');
        throw getBreackChainError();
      }
      return new Promise((resolve, reject) => {
        req.login(user, err => {
          if (err) {
            return reject(err);
          }
          req.session.timestamp = Date.now();
          resolve();
        });
      });
  })
  .then(() => auth.updateLastLogin(email))
  .then(() => res.redirect(req.session.returnTo || '/account');
  .catch(err => {
    if (err.name !== 'BreackChainError') {
      next(err);
    }
  });

注意。你不应该将回调与承诺混合使用,使用一些东西。在上面的例子中,我承诺req.login,所以现在它返回一个承诺。

语言: JavaScript

为简单起见,只需使用:- ( 如果您不想进一步处理错误)

throw new Error("An error occured");

示例:-(获取)

fetch("endpoint/resource", requestOptions)
        .then(response => {
            if(response != null && response.status == 404) {
                throw new Error("RECEIVED NULL OBJECT");
            }
            return response;
        })
        .then(approvedResponse => approvedResponse.blob())
.catch(e => console.log(e));

UnhandledPromiseRejectionWarning: Unhandle promise Rejection (rejection id: 2):我相信这是因为您没有办法处理初始 .thens 中的错误,因此您会得到上述错误。它不是"停止".then,而是正确处理错误。你可以做(err)=>{return},这基本上会"停止"它,但它在你的应用程序中的流量控制。

相关内容

最新更新