KOA / node.js外部函数在回调完成之前响应

时间:2017-05-21 21:12:02

标签: node.js asynchronous koa

首先,我很抱歉这个头衔,我不记得更好了。 我以为我理解Node.js / KOA,至少是基础,但现在我开始觉得我缺少一些基础知识。

看看以下代码:

    router.put("/", 
    parse, 
    async function (ctx, next) {

        // do something

        await next();
    },
    async function (ctx, next) {

        // do something

        await next();
    },
    async function (ctx, next) {

        if (some condition) {

            gm(imageBuffer)
                .quality(80)
                .write(profile_path, async function (err) {
                    gm(imageBuffer)
                        .resize(60, 60)
                        .quality(80)
                        .write(chat_path,async function (err) {

                            await next(); // HERE 1

                        });
                });

        } else {
            await next();
        }

        // HERE 2
    },
    async function (ctx, next) {

        responses.success(ctx, "Success");
    }
);

所以这就是全部。那些熟悉KOA框架的人会立即看到这里发生了什么。我的问题开始/结束的地方是第三个async function。所以我在这里要做的是一些图像处理(保存)。 gm是异步的,但是你可以从代码中看到我正在使用匿名回调函数,而我想要实现的是当gm通过async function完成时调用最后await next(); // HERE 1

但真正发生的是(根据我的理解)... gm异步启动..并且// HERE 2被命中,并且由于没有任何东西,功能结束,KOA返回默认的404响应。我根本无法理解为什么会这样,以及如何克服这一点。 我真正想要的是当回调完成await next(); // HERE 1被调用时,我可以返回成功响应。 当然await next(); // HERE 1被调用(最终),但为时已晚,因为KOA已经回复了404。

如果有人能够并且愿意解释这里到底发生了什么,谢谢。

1 个答案:

答案 0 :(得分:0)

据我所知,你的aproach并没有真正遵循异步await模式:async函数应该“等待”异步部分。然后需要返回一个承诺。所以你必须用promise来封装你的回调。像这样的东西可以起作用(不是testet,只是为了展示这个概念):

function gmAsync(){
    return new Promise(function(resolve,reject){
          gm(imageBuffer)
                .quality(80)
                .write(profile_path, async function (err) {
                    gm(imageBuffer)
                        .resize(60, 60)
                        .quality(80)
                        .write(chat_path,async function (err) {

                            resolve(....whatever....);

                        });
                });
    });
}

然后你的异步函数看起来像这样:

async function (ctx, next) {
    if (some condition) {
        await gmAsync()
        next()
    } else {
        await next();
    }
},
...

有道理吗?