0

アプリケーションでコールバックを管理するために async.js を使用しようとしています。以下はそのコードの例です。ただし、前の関数の 1 つが完了する前に、一連の関数が実行され続けるという問題に遭遇しました。たとえば、resizeImage() 関数は、saveImageData() が起動したときにまだ機能しています。しかし、私の意図は、サイズを変更した後にのみ画像を保存することです。async.js はこれを処理すべきではないでしょうか? resizeImage() にコールバックを渡す必要がある場合、async.js を使用する価値は何ですか? 私が示した例で、非同期ライブラリの使用がどのように役立つかを誰かが示すことができますか?

    if (req.files) {

        //removed some code not relevant to the question

        async.series([

            function (callback) {
                model.saveImageData(tempPath, originalImage, s3Headers);

                callback(null);
            },

            function (callback) {

                var src = tempPath;
                dst = path.dirname(tempPath) + "\\" + newImage;
                model.resizeImage(src, dst);

                callback(null);
            },

            function (callback) {
                //the next function gets called before resizeImage() finishes executing
                model.saveImageData(dst, newImage, s3Headers);

                callback(null);
            }
        ]);

    }
4

1 に答える 1

1

ほとんどの場合saveImageDataresizeImageノンブロッキングの非同期呼び出しです。彼らがI / Oを行っているとします。

を呼び出すとresizeImage、処理が開始され、IO を待機している間に制御が返されます。コードは、関数が作業を終了したことを示す async.js コールバックをすぐに呼び出します。

代わりに、コールバック関数を作成して使用することを意味する、完了saveImageData後にのみ非同期コールバック パラメータを呼び出す必要があります。resizeImage

// this is just a guess at the api.
async.series[function(callback) {

  model.resizeImage(src,dst,function() {
       callback(null);
  });

}];

各非同期関数内のコードが適切なタイミングでコールバックを呼び出すようにする必要があります。

于 2012-11-10T19:28:36.147 に答える