您好我有一种方法,我使用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');
}
});
在这种情况下,即使是不需要的回调。
答案 0 :(得分:1)
首先.promisify已经将投掷转换为拒绝。
至于正常的promisification - promise构造函数是安全的,你可以使用Promise.method
这是安全的。
将同步抛出转换为拒绝的原因是为了创建一致的API,因此您不必一直使用.catch和catch。