簡體   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