2017-05-21 54 views
0

首先,我爲標題感到抱歉,我不介意更好的東西。 我以爲我理解Node.js/KOA,至少是基礎知識,但現在我開始覺得我錯過了一些基礎知識。KOA/node.js外部函數在回調完成前響應

看看下面的代碼:

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是asynchronus,但正如您從代碼中看到的,我使用的是匿名回調函數,而我試圖實現的是當gm通過await next(); // HERE 1完成時最後一個async function被調用。

但真正發生的是(從我的理解)...... gm異步啓動,並且被命中,並且由於沒有任何功能結束,KOA返回默認的404響應。我簡直不明白爲什麼這是如此以及如何克服這一點。 我真正想要發生的是當回調完成時await next(); // HERE 1被調用,我可以返回成功響應。 await next(); // HERE 1當然被稱爲(最終),但太遲了,因爲KOA已經迴應了404個。

如果有人能夠並願意解釋這裏發生了什麼,謝謝。

回答

0

據我所知,你的方法並不是真的遵循異步等待模式: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(); 
    } 
}, 
... 

有道理?

+0

這正是我所期待的。 謝謝你的幫助。 – repca

相關問題