var async = require("async");
function upload_file(file, callback) {
// Do funky stuff with file
callback();
}
var queue = async.queue(upload_file, 10); // Run ten simultaneous uploads
queue.drain = function() {
console.log("All files are uploaded");
};
// Queue your files for upload
queue.push(files);
queue.concurrency = 20; // Increase to twenty simultaneous uploads
function upload_files(files, maxSimultaneousUploads, callback) {
var runningUploads = 0,
startedUploads = 0,
finishedUploads = 0;
function next() {
runningUploads--;
finishedUploads++;
if (finishedUploads == files.length) {
callback();
} else {
// Make sure that we are running at the maximum capacity.
queue();
}
}
function queue() {
// Run as many uploads as possible while not exceeding the given limit.
while (startedUploads < files.length && runningUploads < maxSimultaneousUploads) {
runningUploads++;
upload_file(files[startedUploads++], next);
}
}
// Start the upload!
queue();
}
5条答案
按热度按时间bt1cpqcv1#
像往常一样,我推荐Caolan McMahon的async module。
让
upload_file
函数接受回调作为其第二个参数:guicsvcw2#
上面的答案,re:NPM上的async是最好的答案,但是如果您想了解有关控制流的更多信息:
你应该研究一下控制流模式。在Chapter 7 of Mixu's Node Book中有一个关于控制流模式的精彩讨论。也就是说,我会看看7.2.3中的例子:* 受限并行-循环的异步、并行、并发受限 *。
我改编了他的例子:
r3i60tvu3#
你应该试试排队,我假设
upload_file()
完成后会触发一个回调,类似这样的东西应该可以完成这个任务(未经测试):zmeyuzjn4#
其他的答案似乎都过时了,这个问题可以用async中的paralleLimit很容易的解决,下面是使用方法,我还没有测试。
9avjhtql5#
它可以用递归来解决。
其思想是,最初我们立即启动最大允许上载次数,并且每个请求都应该在其完成时递归地启动一个新上载。
在本例中,我将成功的响应与错误一起填充,并执行所有请求,但如果您希望在第一次失败时终止批量上载,则可以稍微修改算法。