gpt4 book ai didi

javascript - 从中间件中的 promise 调用 'next()' 会导致 'next shouldn' 被多次调用'

转载 作者:行者123 更新时间:2023-11-30 09:27:20 29 4
gpt4 key购买 nike

最近我将我的代码从 Express 更改为 Restify。老实说,我不确定以前是否发生过这种情况,但我想确实发生过。

基本上在我的中间件中,我调用了一个 promisified 方法,当它解析时,我调用 next 并在下一个中间件中做其他事情。当它被拒绝时,我也想在某些情况下调用 next 而没有错误。否则它必须调用错误中间件将 err 传递给 next

somePromise()
.then(()=>{
next();
})
.catch((err)=>{
if(err.someatt) next();
else next(err)
});

它与 somePromise 的预期结果配合得很好。问题在于 nextthen-catch 链约束。当下一个中间件抛出错误时,它会调用 catch 方法并再次调用 next!

我发现 next 有一个 called 属性,当我在再次调用 next 之前将其设置为 false 时,我摆脱了错误。但它当然是一种反模式。我在不同的中间件中遇到了同样的问题,我也使用了 promise (按预期调用 next 然后在 catch 语句中再次调用它)。

还有其他人遇到过这样的问题吗?

最佳答案

把你的链改成这样:

somePromise().then(() => {
next();
}, err => {
// error occurred in somePromise()
if(err.someatt) next();
else next(err);
}).catch(err => {
// error occurred in .then()'s next()
// don't call next() again
});

.then() 的可选第二个参数充当 .catch() 回调,但仅针对链中更高层抛出的错误调用,不会针对相邻 .then() 抛出的错误调用回调。

this awesome answer借来的一个非常有用的流程图演示了 .then(onFulfilled, onRejected).then(onFulfilled).catch(onRejected) 之间的区别:

promise then promise then-catch

关于javascript - 从中间件中的 promise 调用 'next()' 会导致 'next shouldn' 被多次调用',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48590754/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com