Javascript 包含承诺的队列异步操作

Javascript 包含承诺的队列异步操作,javascript,d3.js,queue,queue.js,Javascript,D3.js,Queue,Queue.js,我需要使用队列来序列化异步请求。环顾四周,我发现了迈克·博斯托克的一个小图书馆。但我有点困惑,因为tp如何与promise对象一起使用它 因此,我有大量的需求来自用户界面 function addTask(d){ AsyncOper(d) .then(function () { refresh() }); } AsyncOper返回一个promise对象(angular js实现-$q) 我把q定义为 var q = queue(1);

我需要使用队列来序列化异步请求。环顾四周,我发现了迈克·博斯托克的一个小图书馆。但我有点困惑,因为tp如何与promise对象一起使用它

因此,我有大量的需求来自用户界面

function addTask(d){
   AsyncOper(d)
      .then(function () {
             refresh()
      });
}
AsyncOper返回一个promise对象(angular js实现-$q)

我把q定义为

var q = queue(1);
如何将
addTask
转换为使用
q

我的第一次尝试如下:

    function addTask(d){
       q.defer(request, d)
       q.awaitAll(function(error, results) { console.log("all done!"); });
    }
    function request(d, cb) {
        AsyncOper(d)
            .then(function () {
                refresh();
                cb(null, "finished "+ d);
            })
    }
但它并不是真正的序列化操作,因为我看到它试图运行多个请求。有没有可能以这种方式将承诺和队列结合起来,或者有更好的方式

谢谢。

说,关于等待和等待所有人:

This method should only be called once, after any tasks have been
deferred. If the await callback is set multiple times, or set before 
a task is deferred, the behavior of the queue is undefined.
现在,每次你推迟一项任务后,你都会打电话给Waiticall,这无疑是一种恶龙的搔痒。有没有一个地方可以让你们在排队后等待?如果不是,这个特别的库可能不适合您。

说,关于等待和等待全部:

This method should only be called once, after any tasks have been
deferred. If the await callback is set multiple times, or set before 
a task is deferred, the behavior of the queue is undefined.

现在,每次你推迟一项任务后,你都会打电话给Waiticall,这无疑是一种恶龙的搔痒。有没有一个地方可以让你们在排队后等待?如果不是,这个库可能不适合您。

我也读了这一点,但看看它,似乎所有的
wait
函数都会覆盖队列耗尽时执行的回调,并在队列已为空时调用它。我并没有马上明白为什么OP的代码不起作用。有什么想法吗?你是对的,从源头上看不清楚为什么它不应该起作用。我只是从哲学上反对做文档中说你不应该做的事情,并希望在这种情况下,这种反对可能会转化为错误修复。接下来我要问的问题是:refresh()做什么?您是否已经证明AsyncOper()在请求实际完成之前不会解析?对于
q
,是否只有一个并行度为1的赋值?谢谢@numbers131407。你的评论真的很有帮助。我的AsyncOper是一系列异步操作,我没有序列化其中的一个。一旦我序列化了链中的所有操作,它就可以正常工作了。再次感谢您的帮助。我也阅读了这一部分,但看看它,似乎所有的
wait
函数都会覆盖队列耗尽时执行的回调,并在队列已为空时调用它。我并没有马上明白为什么OP的代码不起作用。有什么想法吗?你是对的,从源头上看不清楚为什么它不应该起作用。我只是从哲学上反对做文档中说你不应该做的事情,并希望在这种情况下,这种反对可能会转化为错误修复。接下来我要问的问题是:refresh()做什么?您是否已经证明AsyncOper()在请求实际完成之前不会解析?对于
q
,是否只有一个并行度为1的赋值?谢谢@numbers131407。你的评论真的很有帮助。我的AsyncOper是一系列异步操作,我没有序列化其中的一个。一旦我序列化了链中的所有操作,它就可以正常工作了。再次感谢你的帮助。这应该行得通。正如@Iain所指出的,文档警告不要反复调用
awaitAll
,但即使这样(至少在当前版本的库中)也不应该阻止它工作。看来一定是别的原因。请注意,如果您只想保持连续队列,则无需调用
awaitAll
,队列将立即开始处理作业。+1谢谢。我没有等待就尝试了,它仍然有效。我不在乎任务完成后的最终结果,希望这样做没有坏处。再次感谢这是一个非常酷的小库,但我确实认为它正遭受身份危机(是队列还是串行/并行任务运行程序?)。这可能不是问题,但应该注意的是,如果用作无限期运行的队列,它会有一点内置内存泄漏,因为作业的结果会永久存储,等待
wait(All)
。再次感谢您提到内存泄漏问题。您对小型库有什么建议吗,一次只需要处理一个用例队列同步任务。主要是限制它的运行速度。没有什么真正让人想到的。你现在使用的这个库非常小。如果您的作业没有返回数据,队列将只维护一个未绑定的稀疏数组,这不会造成太大的内存泄漏(根据浏览器的实现,如果没有为未定义的索引分配空间,则可能根本不会有内存泄漏)。但是,如果您想稍微修改lib,那么用一个简单的对象替换作业数组就很简单了,您可以在完成时从中删除作业键。只要您尊重许可证,就可以修改并重新使用代码。这应该是可行的。正如@Iain所指出的,文档警告不要反复调用
awaitAll
,但即使这样(至少在当前版本的库中)也不应该阻止它工作。看来一定是别的原因。请注意,如果您只想保持连续队列,则无需调用
awaitAll
,队列将立即开始处理作业。+1谢谢。我没有等待就尝试了,它仍然有效。我不在乎任务完成后的最终结果,希望这样做没有坏处。再次感谢这是一个非常酷的小库,但我确实认为它正遭受身份危机(是队列还是串行/并行任务运行程序?)。这可能不是问题,但应该注意的是,如果用作无限期运行的队列,它会有一点内置内存泄漏,因为作业的结果会永久存储,等待
wait(All)
。再次感谢您提到内存泄漏问题。您对tin有什么建议吗