使用解决方案或拒绝或使用Promisify(蓝鸟)进行宣传

时间:2014-12-07 14:08:14

标签: javascript node.js promise bluebird

您好我有一种方法,我使用bluebird提供的Promise类根据第三方函数的结果解析或拒绝。我担心的是第三方功能是同步的,因此可能会引发错误。以下是我的代码:

Authenticator.prototype.createJWTResponse = function(user, secret) {
  if (user && user.ID) {
    var expires = moment().add(7, 'days').valueOf();
    //encode is third party and synchronous that can throw error
    var token = jwt.encode({
      iss: user.ID,
      exp: expires
    }, secret);

    //throw new Error("thrown by a promise method");

    return Promise.resolve({
      token: token,
      expires: expires,
      user: {}
    });

  } else {
    return Promise.reject(new Error('Authenticator:createJWTResponse: user object missing or doesnt have ID'));
  }
};

一种选择是我不在方法中使用拒绝和响应,并使其成为普通的回调方法,然后由Promise.promisify承诺。不过我的问题是;如果有办法使用resolve并拒绝并创建一个promise,以防第三方方法抛出异常。 我的另一个问题是;蓝鸟文档中没有说明;如果一个人在一个方法中使用resolve和reject;可以这样的方法被宣传吗? 我试图宣传上述方法,但由于某种原因它无法返回。不会抛出错误;这让我怀疑,如果一个人正在使用决心,拒绝一个方法,那么这样的方法就无法实现。

有人可以为我澄清一下吗?提前谢谢。

(更新)

如果我将方法包装在Promise.method中; bluebird抛出一个非常明确的错误如下:

可能未处理错误:其他承诺返回方法中的同步错误

从此方法内部返回Promise.try也会抛出与Promise.method相同的错误。

在try catch中包装方法中的代码并在出错时拒绝也会抛出:

可能未处理错误:

(溶液)

正如本杰明所说;从方法中取出所有的解析和拒绝调用并将其包装在Promise.method中会得到预期的结果。最终代码如下:

Authenticator.prototype.createJWTResponse = Promise.method(function(user, secret) {
  if (user && user.ID) {
    var expires = moment().add(7, 'days').valueOf();
    var token = jwt.encode({
      iss: user.ID,
      exp: expires
    }, secret);

    //Note: This is caught by the catch block on this method
    //throw new Error('sync error thrown');

    return {
      token: token,
      expires: expires,
      user: {}
    }
  } else {
    throw new Error('Authenticator:createJWTResponse: user object missing or doesnt have id');
  }
});

在这种情况下,即使是不需要的回调。

1 个答案:

答案 0 :(得分:1)

首先.promisify已经将投掷转换为拒绝。

至于正常的promisification - promise构造函数是安全的,你可以使用Promise.method这是安全的。

将同步抛出转换为拒绝的原因是为了创建一致的API,因此您不必一直使用.catch和catch。