Javascript 基于承诺的队列

Javascript 基于承诺的队列,javascript,node.js,promise,Javascript,Node.js,Promise,我有一个文件数组,我想一次攻击N。以及一个返回承诺的函数doWork var files = [] var doWork = function(file) { return asyncFn(file) } 我希望能够动态地推送到这个队列上 编辑:我尝试了各种模块(承诺队列、异步q)。它们都以某种方式工作,但不允许使用数组作为队列。他们有自己的内部结构,你需要推进 我之所以需要使用数组,是因为我希望能够将项目推送到队列中,并检查它是否已在队列中。您可以执行以下操作: function en

我有一个
文件数组
,我想一次攻击
N
。以及一个返回承诺的函数
doWork

var files = []

var doWork = function(file) {
  return asyncFn(file)
}
我希望能够动态地推送到这个队列上

编辑:我尝试了各种模块(承诺队列、异步q)。它们都以某种方式工作,但不允许使用数组作为队列。他们有自己的内部结构,你需要推进


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

您可以执行以下操作:

function enq (step)
  var f = function() {
    var d = Q.defer();
    step(d);
    return d.promise;
  }
  enq_head = enq_head.then(f);
}
其中步骤是一个函数,它实现了您传递给它的承诺。但我不推荐它,因为它只是一种奇特的方式,可以更有效地完成setTimeout所做的事情


如果要跟踪已计划和/或已完成的文件,只需将它们放在完成列表中,或将它们从待办事项列表中取出,在文件名下的对象中插入bool或其他内容。这是一个与日程安排无关的问题

下面是您如何使用您表示正在使用的蓝鸟

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
});

一句警告的话——这对当前调用的运行量、多次调用函数或从多个节点进程(显然)以较大/较小的并发性执行设置了上限。然而,在简单的情况下,这是可行的。

请在问题中提出一个问题。你尝试了什么?你在哪里遇到了困难?如果你使用Bluebird,它有一个内置的(带有一个数组)将是一个让你感兴趣的答案。我正在使用Bluebird,但我看不到一个对我有帮助的方法。好奇。@DominicBou Samra添加应答这在我看来不像是队列-可能是
{concurrency:1}
。而且它似乎不是动态的(我假设OP的意思是,在队列已经运行的情况下,您仍然可以添加任务)?@Bergi第一行是:“我有一个文件数组,我想一次攻击N。还有一个函数doWork,它返回一个承诺。”。这不是动态的,但它肯定是一个队列。你是对的-请向上投票:-)@多米尼克:如果你正在寻找一个解决方案,让你在队列已经运行时推到队列上,请告诉我们(我会回答)Hi Bergi。我不熟悉map的并发段,谢谢。我想要一个动态队列。我已经编辑了我的问题,以包括我目前完成这项工作的方式。@DominicBou Samra me和Bergi是两个不同的人:P另外,你还没有根据我所能说的更新问题。