如何处理异步回调承诺拒绝?

How to handle async callback promise rejection?

尝试处理我的异步代码(nodeJS、ExpressJS)中的每个异常: 这里几乎是伪代码。我将限制器 (npm 限制器) 模块与方法 removeTokens (num, callback(err,remainingRequest)) 一起使用。大部分代码都在回调中,我想捕获那里的任何错误并将其抛给处理程序,但现在回调中的错误仍然标记为 "unhandled exception",我不明白为什么。

app.post('/', async (req, res) => {
  try {
    ...
    return getAll();

    async function getAll () {
      limiter.removeTokens(1, async (err, remainingRequest) => {
        try {
          throw new Error('THROWN')
        } catch (error) {
          throw error
        }
      })
    }
  } catch (error) {
    console.log(error);
  }
});

您不应该将 async 函数传递给不需要它们的东西(除非您捕获所有错误,就像您使用 app.post 回调一样)。相反,给自己一个 limiter.removeTokens 的包装器,returns 一个承诺:

function removeTokens(limiter, id) {
    return new Promise((resolve, reject) => {
        limiter.removeTokens(id, (err, remainingRequest) => {
            if (err) {
                reject(err);
            } else {
                resolve(remainingRequest);
            }
        });
    });
}

(您也可以查看 util.promisify。)

然后:

app.post('/', async (req, res) => {
  try {
    ...
    await getAll(); // *** Or you might just use `removeTokens(limiter, 1)` directly here

    function getAll() {
      return removeTokens(limiter, 1);
    }
  } catch (error) {
    console.log(error);
  }
});

这里是直接使用removeTokens

app.post('/', async (req, res) => {
  try {
    ...
    await removeTokens(limiter, 1);
  } catch (error) {
    console.log(error);
  }
});

首先,如果可能的话,请尽可能多地分享代码,这样我们就可以很容易地调试问题所在。 来问你的问题我认为问题是在你的 try..catch 块中你抛出错误而不是用 reject 处理它。下面我粘贴了一个代码块,您可以尝试让我知道它是否适合您。请注意,语法可能不同,但想法是您必须 reject Promise 以防出错。

`````````limiter.removeTokens(1, async (err, remainingRequest) => {
````````````try {
```````````````throw new Error('THROWN')
````````````} catch (error) {
```````````````return Promise.reject(error) //
````````````}
`````````})
``````}
```} catch (error) {
``````console.log(error);
```}
})