Коа: обещание против асинхронного ожидания промежуточного программного обеспечения
Я пытаюсь написать промежуточное программное обеспечение Коа, если условие выполнено, перейти к следующему промежуточному программному обеспечению. Если условие не выполнено, закоротите поток. Я нашел 2 способа, используя обещание или 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();
}
})
Есть ли разница между этими двумя методами? Если нет, какой из них предпочтительнее?
1 ответ
Когда нет кода после await next()
Вы достигаете того же самого. Как упоминалось в комментарии ippi, при наличии кода впоследствии await будет просто "чище", поскольку будет ждать, пока обещание не будет решено, чтобы перейти к следующей строке, тогда как "обычным способом обещаний" вам придется обрабатывать разрешение. обещания В вашем конкретном примере это не имеет значения, но, вероятно, в других частях вашего кода вы будете использовать один или другой (может быть, в другом промежуточном программном обеспечении?) И захотите гомогенизировать свой код.
Если у вас что-то будет потом, вы сделаете это так (возможно, вы уже знаете):
асинхронные функции (узел 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, возможно, оригинальные обещания выглядят лучше...