【问题标题】:Why does this async.js series not behave synchronously为什么这个 async.js 系列不同步运行
【发布时间】:2013-04-25 22:20:05
【问题描述】:

我正在尝试使用 async.js 来管理应用程序中的回调。下面是该代码的示例。但是,我遇到了一个问题,即一系列函数在前面的函数之一完成之前继续执行。例如,当 saveImageData() 触发时,resizeImage() 函数仍在工作。但我的意图是仅在调整大小后保存图像。 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);
            }
        ]);

    }

【问题讨论】:

    标签: javascript asynchronous


    【解决方案1】:

    saveImageDataresizeImage 很可能是非阻塞的异步调用。鉴于他们正在进行 I/O。

    所以你调用resizeImage,它开始处理,在等待 IO 时返回控制,你的代码立即调用 async.js 回调,表明函数已经完成了它的工作。

    相反,您应该只在saveImageDataresizeImage完成后调用异步回调参数,这意味着创建和使用回调函数:

    // this is just a guess at the api.
    async.series[function(callback) {
    
      model.resizeImage(src,dst,function() {
           callback(null);
      });
    
    }];
    

    您仍然必须确保每个异步函数内的代码在适当的时间调用回调。

    【讨论】:

    • 如果我按照你的建议做,数组中的下一个函数永远不会被调用。
    • 我的错误是我未能执行 resizeFunction 内部的回调。你的答案是正确的。
    猜你喜欢
    • 2021-05-19
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2017-03-25
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多