2017-05-21 5 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フレームワークに精通している人は、ここで何が起こっているのかをすぐに見ていきます。私の問題の開始/終了箇所は3番目のasync functionです。だから私がここでやろうとしているのは、画像操作(保存)です。 gmはasynchronusですが、コードからわかるように、私は匿名のコールバック関数を使用していますが、達成しようとしているのは、await next(); // HERE 1で最後にasync functionが呼び出されていることです。

実際に何が起こったのですか(私の理解から)... gmは非同期で開始し、がヒットし、何もないので、関数の終了でKOAはデフォルトの404応答を返します。私はこれがなぜそうであるか、そしてこれを克服する方法を理解できないだけです。 私が実際にやりたいことは、コールバックが終了するときです。await next(); // HERE 1が呼び出され、私は成功応答を返すことができます。 await next(); // HERE 1もちろん、KOAは既に404で応答しているので、最終的には遅くなります。

ここで何が起こっているのかを説明できる人がいれば、ありがとうございます。

答えて

0

私の知る限りでは、あなたのaproachは実際には非同期待機パターンに従っていません。async関数は非同期部分を "待機"する必要があります。これは約束を返す必要があります。だから、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....); 

         }); 
       }); 
    }); 
} 

、その後、あなたは非同期関数は次のようになります:このような何かが(ちょうど概念を示すように、testetない)仕事ができる

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

理にかなっていますか?

+0

これはまさに私が探していたものです。 ありがとうございます。 – repca

関連する問題