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

Javascript 如何处理异步回调承诺拒绝?,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,尝试处理异步代码(nodeJS、ExpressJS)中的每个异常: 这里几乎是伪代码。我将limiter(npm limiter)模块与removeTokens(num,callback(err,remainingRequest))方法一起使用。大部分代码都在回调中,我想捕获并将其中的任何错误抛出给处理程序,但目前回调中的错误仍然标记为“未处理的异常”,我不明白为什么 app.post('/', async (req, res) => { try { ... retur

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

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
回调一样)。相反,给自己一个
限制器的包装。removeTokens
返回一个承诺:

function removeTokens(limiter, id) {
    return new Promise((resolve, reject) => {
        limiter.removeTokens(id, (err, remainingRequest) => {
            if (err) {
                reject(err);
            } else {
                resolve(remainingRequest);
            }
        });
    });
}
(您也可以对此进行调查。)

然后:

这里它直接使用
removeTokens

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

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

function removeTokens(limiter, id) {
    return new Promise((resolve, reject) => {
        limiter.removeTokens(id, (err, remainingRequest) => {
            if (err) {
                reject(err);
            } else {
                resolve(remainingRequest);
            }
        });
    });
}
(您也可以对此进行调查。)

然后:

这里它直接使用
removeTokens

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

首先,如果可能的话,请尽可能多地共享代码,这样我们就可以很容易地调试出问题所在。 关于您的问题,我认为问题在于,在
try..catch
块中,您抛出了错误,而不是使用
拒绝处理它。下面我粘贴了一个代码块,您可以尝试让我知道它是否适合您。请不要使用不同的语法,但如果出现错误,您必须拒绝承诺

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

首先,如果可能的话,请尽可能多地共享代码,这样我们就可以很容易地调试出问题所在。 关于您的问题,我认为问题在于,在
try..catch
块中,您抛出了错误,而不是使用
拒绝处理它。下面我粘贴了一个代码块,您可以尝试让我知道它是否适合您。请不要使用不同的语法,但如果出现错误,您必须拒绝承诺

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