Коа: обещание против асинхронного ожидания промежуточного программного обеспечения

Я пытаюсь написать промежуточное программное обеспечение Коа, если условие выполнено, перейти к следующему промежуточному программному обеспечению. Если условие не выполнено, закоротите поток. Я нашел 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, возможно, оригинальные обещания выглядят лучше...

Другие вопросы по тегам