2013-12-12 50 views
1

我有一个异步和两个数组的问题。node.js async for each two arrays

我有两个数组

var arrayOne = new Array(); 
var arrayTwo = new Array(); 

目前我正在试图弄清楚如何做到以下几点异步式的瀑布里面:

... // some code 
function (arrayOne, arrayTwo, callback) { 
    // do stuff 
    for(var i = 0; arrayOne.length > i; i++) { 
     // do more stuff 
     callback(e, arrayOne[i], arrayTwo[i]); 
    } 
}, 
function (valueOne, valueTwo, callback) { 
... // more code 

我尝试使用async.foreach但只有它applys到一个阵列:/

麦角:

... // some code 
function (arrayOne, arrayTwo, callback) { 
    // do stuff 
    forEach(arrayOne, function(valueOne, callback) { 
     // do more stuff 
    }, function(e){ 
     // do more stuff 
     callback(e, valueOne, /* valueTwo???? */); 
    }); 
}, 
function (valueOne, valueTwo, callback) { 
... // more code 

回答

0

我想你也得太多:

function (arrayOne, arrayTwo, callback) { 
    forEach(arrayOne, callback, function(){ 
     forEach(arrayTwo, callback); 
    }); 
}; 
+0

在该示例中,'callback'被称为与来自每个阵列的元件。 –

2
2个阵列

// async.map应该是这样的:

function map(a, b, func, cb) { 
    var results = []; 
    var length = Math.min(a.length, b.length); 
    var countdown = length; // count to 0 

    for(var i=0; i < length; i++) { 
     func(a[i], b[i], function (err, result) { 
      results.push(result); 
      countdown--; 
      if(countdown === 0) { 
       cb(null, results) // cb is call on last result 
      } 
     }) 
    } 
} 

//测试

var a = [1,1,1]; 
var b = [2,2,2]; 

function sum(a, b, cb) { 
    // simulate async with timeout 
    setTimeout(function() { 
     cb(null, a + b); 
    }, 1000); 
} 

map(a, b, sum, function (err, results) { 
    console.log(results); 
}) 

输出中:

[ 3, 3, 3 ] 
3

遍历使用async.times最短数组的长度:

function task(a, b, next) { 
    setTimeout(function() { 
     next(null, a + b); 
    }, 1000); 
} 

function work(a, b, done) { 
    async.times(Math.min(a.length, b.length), function(i, next) { 
     task(a[i], b[i], next); 
    }, done); 
} 

var a = [1, 1, 1, 1]; 
var b = [1, 1, 1]; 

work(a, b, function(err, result) { 
    console.log('result:', result); 
}); 

console.log('continuing...');