我正在尝试编写Koa中间件,如果条件满足,请转到下一个中​​间件。如果条件未满足,请短路流体。我发现了两种方式,使用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();
    }
})


这两种方法之间有什么区别吗?如果没有,则首选哪一个?

最佳答案

await next()之后没有代码时,您将获得相同的结果。正如ippi在评论中提到的那样,当以后拥有代码时,withwait将只是“干净”的,因为它将等待,直到诺言解决后再转到下一行,而在“通用诺言方式”中,您将不得不处理解决方案的承诺。在您的特定示例中,这无关紧要,但是可能在代码的其他部分中,您将使用一个或另一个(也许是在另一个中间件中?),并且您将希望使代码同质。

万一您以后会有什么事情,可以这样进行(可能您已经知道):

异步功能(节点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进行编码的人来说,原始的诺言看起来会更好。

关于javascript - koa:promise vs async等待中间件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50892664/

10-10 05:32