循环中的异步操作

时间:2016-04-08 13:59:07

标签: javascript jquery node.js

我可以使用以下方法选择所有图像src:

var images = $("img");
images.each(function(i, img) {
    var src = $(img).attr('src');
    console.log(src);
});
res.status(200).send({"message" : "OK"});

我还可以使用以下方法从src复制一个图像:

request(src).pipe(fs.createWriteStream('photo_' + i + '.jpg')).on('close', function(){
    res.status(200).send({"message" : "OK"});
});

我现在需要复制所有src的所有图像,但我不确定如何在循环中组合异步操作。

1 个答案:

答案 0 :(得分:4)

这里有几种解决方案:

1使用promises和all (如果您已经在使用ES6或像Bluebird这样的库)

Promise.all(images.map(function(){
    return ... yourAsynchronousOperationPromise
})).then(function(){
   // all done
});

现在这可以通过第一个promisifying被调用的异步函数来方便地完成。

在您的情况下,您可以使用请求包的Promise ready版本request-promise,但it's discouraged when using pipe

2使用基于setImmediate的循环:

(function step(){
    var image = images.shift();
    if (!image) return; // finished
    doTheAsynchronousThing(image, function(){
        setImmediate(step);
    });
})();
相关问题