koa:promise vs async等待中间件

时间:2018-06-17 00:03:39

标签: javascript node.js express koa koa2

我正在尝试编写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();
    }
})

这两种方法之间是否存在差异?如果没有,首选哪一个

1 个答案:

答案 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编码的人来说,原始承诺看起来会更好......