Nodejs Q承诺从未使用护照js调用

时间:2015-08-25 04:57:58

标签: javascript node.js promise passport.js passport-local

我正在使用护照库来帮助我进行用户注册。当我经历几个异步步骤时,我也使用'Q'诺言库来避免厄运的金字塔。

一切正常,直到我从其中一个承诺的步骤中抛出错误。我原本假设执行会进入.fail函数,在那里我可以处理错误并退出护照并注册失败。但由于我不理解的原因,.fail函数永远不会被调用。相反,我只是在浏览器窗口和控制台中获得了一个stackdump。

控制代码在这里:

q.fcall(checkEmailIsFree({'email':email, 'username':username, 'password':password}))
.then(checkUsernameIsFree)
.then(registerUser)
.then(function (user) {
  if (user) {
    logDebug('REGISTERED: ' + email);
    return done(null, user);
  }
  else {
    logDebug('Could not register');
    return done(null, false);
  }
})
.fail(function (err) {
  logError('I never get here');
  return done(null, false);
})
.done();

这就是我在checkEmailIsFree

中投掷的方式
var error = new Error('Bad times. Email is in use: ' + email);
throw error;

是否有某些整体快递/节点代码设置为以某种方式快速转储异常?为什么不叫我的捕获?我错过了什么?

1 个答案:

答案 0 :(得分:1)

我认为done(onFulfilled, onRejected, onProgress)在这种情况下可以提供帮助。你可以尝试:

q.fcall(checkEmailIsFree({'email':email, 'username':username, 'password':password}))
.then(checkUsernameIsFree)
.then(registerUser)
.then(function (user) {
  if (user) {
    logDebug('REGISTERED: ' + email);
    return done(null, user);
  }
  else {
    logDebug('Could not register');
    return done(null, false);
  }
})
.done(undefined, function (err) {
  logError('Error!'); // used in case of reject
  return done(null, false);
});