Async forEachOfLimit函数不限制集合的迭代

时间:2015-11-09 07:44:33

标签: node.js asynchronous

我的问题是 - async.forEachLimit 函数不会将迭代限制n次。

我为我的收藏执行异步任务。我试过这个......

var async = require('async');
console.log(finalLocations.length); //Expecting 4 

所以我需要执行循环3次,因为我在键中使用当前值,在同一操作中使用键的下一个值。它将导致最后一次迭代的未定义。

因为我在迭代时间少了1次收集的时间。我用过这个。如果长度为4,我想迭代它3次,即0,1,2。这样 -

async.forEachOfLimit(finalLocations, finalLocations.length - 2, function (value, key, next) {

    console.log(key + ': ' + value);

    //distanceMatrix.matrix(finalLocations[key], finalLocations[key + 1], function (err, successiveDistances) {
    //    if (err) return next(err);
    //    if (!successiveDistances || successiveDistances.status !== 'OK') {
    //        return next({status: 400, message: 'No distance'});
    //    }
    //
    //    if (successiveDistances.rows[0].elements[0].status === 'OK') {
    //        totalTime = totalTime + successiveDistances.rows[0].elements[0].duration.value;
    //        totalDistance = totalDistance + successiveDistances.rows[0].elements[0].distance.value;
    //    }
    //    next();
    //});
    next();
}, function (err) {
    console.error('Printing error here :- ' + err);
    if (err) return callback(err);

    console.log('Successfully completed all iterations !!');
    callback(null, {totalTime: 0, totalDistance: 0});
});

或者,如果简单,我可以发布。

async.forEachOfLimit([1,2,3,4], 2, function (value, key, next) {
    console.log(key + ': ' + value); 
    next();
}, function (err) {
    console.error('Printing error here :- ' + err);
    if (err) return callback(err);

    console.log('Successfully completed all iterations !!');
    callback(null, {totalTime: 0, totalDistance: 0});
});

它的控制台是:

0: 1
1: 2
2: 3
3: 4
Printing error here :- null
Successfully completed all iterations !!

1 个答案:

答案 0 :(得分:3)

async.forEachOfLimit()迭代您传递的整个集合。第二个参数(限制值)仅指定同时在飞行中有多少次迭代。因此,如果你传递一个包含4个元素和3个限制的数组,它将启动前3个操作,然后当其中一个操作完成时,它将开始第4个操作。

这就是该功能被编码为工作的方式。

如果您只想迭代集合的一部分,您可以拼出集合的部分副本并将其传递给async.each()