将一个q promise数组拆分为多个数据包,并依次运行这些数据包

Split an array of q promises into packets and run these packets in series

本文关键字:数据包 运行 拆分 一个 数组 promise      更新时间:2023-09-26

我的目标是复制文件,并将并行复制的文件限制为定义的变量。因此,我将调用fs.copyq承诺数组拆分为数据包,并使用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实现我的目标

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

是的,这是因为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([]));