如何处理异步回调承诺拒绝?
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);
```}
})
尝试处理我的异步代码(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);
```}
})