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