如何在Node.JS中中止失败的Q承诺

时间:2014-02-17 06:07:58

标签: javascript node.js promise q

假设我正在构建注册流程,我的内容看起来像这样:

Q.nfcall(validateNewRegCallback, email, password)
    .fail(function(err){
        console.log("bad email/pass: " + err);
        return null;
    })
    .then(function(){
        console.log("Validated!");
    })
    .done();

如果我的注册失败,我想抓住它,然后死掉。相反,我看到“坏电子邮件/通过”和“验证”。为什么会这样,我怎么能在第一次失败的呼叫中中止?

1 个答案:

答案 0 :(得分:4)

fail处理程序确实捕获了被拒绝的承诺,但确实返回了已履行的承诺(在您的情况下为null),因为已经处理了错误...

那么你能对此做些什么呢?

  • 重新抛出错误以拒绝返回的promise。它会导致done抛出它。

    Q.nfcall(validateNewRegCallback, email, password).fail(function(err){
        console.log("bad email/pass: " + err);
        throw err;
    }).then(function(){
        console.log("Validated!");
    }).done();
    
  • 成功回调后处理错误(也处理成功回调中的错误):

    Q.nfcall(validateNewRegCallback, email, password).then(function(){
        console.log("Validated!");
    }).fail(function(err){
        console.log("bad email/pass: " + err);
    }).done();
    
  • 只需处理同一承诺的两种情况 - 每种方法都接受两次回调:

    Q.nfcall(validateNewRegCallback, email, password).done(function(){
        console.log("Validated!");
    }, function(err){
        console.log("bad email/pass: " + err);
    };
    

    当然,您也可以使用.then(…, …).done()