当调用 reject(err)
时,以下代码片段会导致“未捕获的异常警告”,尽管该方法是在 try/catch 语句内调用的。 p>
async verifyToken (token: string): Promise<string | object> {
return new Promise<string | object>( (resolve, reject) => {
jwt.verify(token, this._publicKey, (err, decoded) => {
if (err) {
reject(err);
} else {
resolve(decoded);
};
});
}
这违反了我对 Promise 和 async/await 模式的理解,因为到目前为止,如果在 try/catch 语句内调用该函数,我预计不会出现无法处理的错误。
try {
const obj = await verifyToken(token);
} catch (err) {
...
}
目前我通过工作环境避免了这个问题。
async verifyToken (token: string): Promise<string | object> {
let cause: any;
const rv = await new Promise<string | object>( (resolve, reject) => {
jwt.verify(token, this._publicKey, (err, decoded) => {
if (err) {
cause = err;
resolve(undefined);
} else {
resolve(decoded);
};
})
});
if (rv) {
return rv;
} else if (cause instanceof Error) {
throw cause;
} else {
throw new Error('invalid token');
}
}
我的问题:
- 为什么 catch 不能解决这个问题?
- 是否有更好的解决方案来避免异步函数内的 Promise 中出现未处理的错误?
最佳答案
我知道这已经过时了,很抱歉,我刚才在寻找其他东西时偶然发现了这个,但我想我已经找到了这个特定问题的答案。
Promise
都不会resolve
也不reject
在 Actor 阵容中jwt.verify()
throws
它自己的错误。猜测该库是 jsonwebtoken
或类似的东西,我怀疑您传递了无效的 token ,并且该方法执行 throw new Error('Invalid token')
我进一步认为,如果您要返回new Promise
,那么您正在混合一些想法。您可能不应该使用 async
关键字。
建议,
function verifyToken(token: string): Promise<ABetterType> {
return new Promise((resolve, reject) => {
try {
jwt.verify(token, this._publicKey, (err, decoded) => {
if (err) {
reject(err)
return;
}
resolve(decoded)
}
} catch (err) {
reject(err)
}
});
}
或者(我想我会尝试的)
function verifyToken(token: string): Promise<ABetterType> {
return new Promise((resolve, reject) => {
try {
const decoded = jwt.verify(token, this._publicKey);
resolve(decoded);
} catch (err) {
reject(err);
}
});
}
关于javascript - 异步函数中的 Promisereject() 导致 “Uncaught (in promise)” 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47855090/