将q promises数组拆分为数据包并串行运行这些数据包

时间:2014-11-11 18:58:50

标签: javascript node.js promise q

我的目标是复制文件并将并行复制的文件限制为已定义的变量。因此,我将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实现我的目标?

1 个答案:

答案 0 :(得分:2)

  

看来,几乎所有任务都是在同一时间开始的。

是的,这是因为mapreduce都是同步的,迭代所有数据包并立即创建所有任务。

相反,您需要将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([]));