javascript - 异步函数中的 Promisereject() 导致 “Uncaught (in promise)” 警告

标签 javascript typescript asynchronous

当调用 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/

相关文章:

javascript - 如果我们从 html 页面调用 Angular 函数那么它将如何工作?

javascript - Visual Studio ReSharper - 在外部模块中声明的 Typescript 自动导入类 - 使用 from 而不是 require

angular - 如何为 Angular 响应式(Reactive)表单验证设置最小值和最大值?

javascript - 按顺序对数组项执行函数

c# - 异步数据读取器和执行顺序

asynchronous - 从EJB @Asynchronous调用访问CDI SessionScoped bean

c# - RegularExpressionValidator 控件中以下正则表达式的问题

javascript - 使用循环处理 javascript 中的 json 数组

javascript - jquery 事件不是持久的

javascript - 如何在 JavaScript/TypeScript 中创建具有非唯一键的 Map?