我正在尝试编写Koa中间件,如果遇到条件,请转到下一个middeware。如果条件未满足,则使流量短路。我找到了两种方法,使用promise或async / await。
方法1:基于承诺
app.use(function(ctx, next){
// if condition met
if (conditionMet){
ctx.somedata = 'bar';
// go to next middleware
return next();
}
})
方法2:异步/等待
app.use(async function(ctx, next){
// if condition met
if (conditionMet){
ctx.somedata = 'bar';
// go to next middleware
await next();
}
})
这两种方法之间是否存在差异?如果没有,首选哪一个?
答案 0 :(得分:2)
当await next()
之后没有代码时,你会实现同样的目标。正如ippi在评论中提到的那样,之后有代码时,等待将会“更清洁”,因为它会等到承诺决定转到下一行,而在“共同承诺方式”中你必须处理分辨率承诺。在您的具体示例中,它没关系,但可能在您的代码的其他部分,您将使用其中一个(可能在另一个中间件?),并且您将希望同化您的代码。
如果你之后会有一些事情你可以这样做(可能你已经知道了):
异步功能(节点v7.6 +)
app.use(async (ctx, next) => {
// if condition met
if (conditionMet){
ctx.somedata = 'bar';
// go to next middleware
await next();
// after code
console.log('this will be executed after promise next() is resolved');
}
});
常用功能
app.use((ctx, next) => {
// if condition met
if (conditionMet){
ctx.somedata = 'bar';
// go to next middleware
return next().then(() => {
// after code
console.log('this will be executed after promise next() is resolved');
});
}
});
我不能说有一个更好的,它们只是不同。对我来说async / await看起来更干净,我可以亲自控制代码的流程并避免Promises Hell。我认为它们越来越强大,并且受到新javascript标准的支持,但是对于那些开始用js编码的人来说,原始承诺看起来会更好......