基于承诺的队列

时间:2014-10-20 04:54:04

标签: javascript node.js promise

我有一个files数组,我想一次攻击N。以及一个返回promise的函数doWork

var files = []

var doWork = function(file) {
  return asyncFn(file)
}

我希望能够动态地推送这个队列。

编辑:我尝试了各种模块(promise-queue,async-q)。它们都以某种方式工作,但它们不允许将数组用作队列。他们有自己的内部结构,你需要推动。

我需要使用数组的原因,因为我希望能够将项目推送到队列中,并检查它是否已经在队列中。

2 个答案:

答案 0 :(得分:1)

以下是您使用Bluebird表达自己使用的方法。

var files = ["foo.txt", "bar.txt", "baz.txt"];
var task = Promise.map(files, doWork, {concurrency: 4}); // four at a time 

task.then(function(results){
       // results contains the results, tasks are executed at most 4 at a time
});

需要注意的是 - 这会将上限设置为当前调用运行多少,多次调用该函数,或者从多个节点进程调用<显然上限 )使用更大/更小的并发执行。然而,在简单的情况下 - 这是有效的。

答案 1 :(得分:-1)

你可以这样做:

function enq (step)
  var f = function() {
    var d = Q.defer();
    step(d);
    return d.promise;
  }
  enq_head = enq_head.then(f);
}

其中step是一个履行传递承诺的函数。但是我不推荐它,因为它只是一种花哨的方式来做更有效的setTimeout。

如果你想跟踪你已安排和/或完成的文件,只需将它们放入完成列表或将它们从你从中获取的待办事项列表中取出,将一个bool粘在一个对象下文件名或其他什么。这是调度中的一个单独问题。