2016-04-08 3 views
-1

я могу выбрать все изображения SRC с помощью:асинхронной операции в цикле

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

И я также могу скопировать одно изображение с СРК с помощью:

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

теперь мне нужно скопировать все изображения для всех src, но я не уверен, как объединить операцию async в цикле.

+0

О.П., вы можете, пожалуйста, точный, чего не хватает в ответе? –

ответ

4

Есть несколько решений здесь:

1 Используйте обещания и all (если вы уже используете ES6 или библиотеку как Bluebird)

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

Прямо сейчас это было бы удобно сделать первая promisifying вызываемая асинхронная функция.

В вашем случае вы можете использовать готовую версию Promise пакета запросов, 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); 
    }); 
})(); 
+0

Не могли бы вы показать мне конкретный пример, используя обещания. Думаю, я пообещаю. – tommyd456

+0

@ tommyd456 Вот пример в моем собственном коде: https://github.com/Canop/miaou/blob/master/libs%2Fprefs.js#L143 –

+0

Я просто посмотрел, и есть уже обещанная готовая версия пакета запросов : https://github.com/request/request-promise –

Смежные вопросы