繁体   English   中英

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

[英]KOA / node.js outer function responds before callback finishes

首先,对不起标题,我不能介意更好的东西。 我以为我了解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通过await next(); // HERE 1完成时,将调用最后一个async function await next(); // HERE 1 await next(); // HERE 1

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

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

据我所知,您的方法并没有真正遵循异步等待模式: async功能应“等待”异步部分。 然后,这需要返回承诺。 所以,你必须encapulate回调的promise 像这样的事情可能会起作用(不是睾丸,只是为了展示这个概念):

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();
    }
},
...

说得通?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM