gpt4 book ai didi

javascript - 通过使用resolve或reject或Promisify(bluebird)进行 promise

转载 作者:行者123 更新时间:2023-12-03 11:16:08 25 4
gpt4 key购买 nike

嗨,我有一种方法,使用 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 进行 promise 。然而我的问题是;如果有办法使用resolve和reject并创建一个promise,以防第三方方法抛出异常。我的另一个问题是; bluebird 文档中没有说明;如果在方法中使用resolve和reject;可以 promise 这样的方法吗?我试图 promise 上述方法,但由于某种原因它无法返回并且不会抛出错误;这让我怀疑,如果在方法中使用resolve、reject,那么就不能 promise 这样的方法。

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

(更新)

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

可能未处理的错误:否则 promise 返回方法中的同步错误

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

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

可能未处理的错误:

(解决方案)

按照本杰明的建议;从方法中删除所有的resolve和reject调用并将其包装在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');
}
});

在这种情况下甚至不需要回调。

最佳答案

首先,.promisify 已经将抛出转换为拒绝。

对于正常的 promise - Promise 构造函数是抛出安全的,您可以使用抛出安全的 Promise.method

同步抛出转换为拒绝的原因是为了创建一致的 API,这样您就不必一直进行 .catch 和 catch。

关于javascript - 通过使用resolve或reject或Promisify(bluebird)进行 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27343489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com