我的目标是复制文件并将并行复制的文件限制为已定义的变量。因此,我将q
个承诺的数组与调用fs.copy
分成数据包,并使用reduce函数串行运行这些数据包。
var promise = _.reduce(packets, function (previous, packet) {
var map = _.map(packet, function (file) {
return q.nfcall(fs.copy, file.source, file.target);
});
return previous.then(q.all.bind(null, map));
}, q());
如何使用q
实现我的目标?
答案 0 :(得分:2)
看来,几乎所有任务都是在同一时间开始的。
是的,这是因为map
和reduce
都是同步的,迭代所有数据包并立即创建所有任务。
相反,您需要将q.nfcall(fs.copy, …)
次调用放入previous.then
回调中(您使用.bind()
非常优雅地隐藏隐藏),这样它们只会在previous
结算后调用:
var promise = _.reduce(packets, function (previous, packet) {
return previous.then(function(packetresult) {
var map = _.map(packet, function (file) {
return q.nfcall(fs.copy, file.source, file.target);
});
return q.all(map); // optionally, also pass the previous packetresult
});
}, q([]));