nodejs 并行async.parallel,以及使用循环生成的函数

背景: 由于在实际项目中,golang通过grpc请求nodejs服务, nodejs服务要同时获取多个结果,使用parallel能实现。
但是parallel中执行的函数的数量,函数的参数是不定的,是根据一个数组的数据构建的。这里存在一个问题,使用数据生成的函数,得到的参数值,全是数组的最后一个值。为解决这个问题,使用了array类似队列的性能。

看程序:

parallel.js

var async = require('async');
var values =new Array(1,2,3,4);
var vlen = values.length;
var funcArr = new Array();
for(var k=0; k {
      return callback(null,k); }
}

async.parallel(funcArr, function (err, resp){
  console.log(resp)
});

执行 node parallel.js
(如果报错说是找不到 async module,需要安装)

以上执行结果为 [ 4, 4, 4, 4 ]
也就是说 funcArr 中的每个函数的k取的是 最后一个k的值4,这是因为funcArr只是存储函数,变量。其中变量k的内存地址不变,只是在循环的时候,k 的值最后更新为 4 (不是3)。 所以在parallel 执行函数时,k的值为4, 每个函数的返回的k也是4.

解决办法是使用 array 的 类似队列的属性。

var async = require('async');
var values =new Array(1,2,3,4);
var vlen = values.length;
var funcArr = new Array();
for(var k=0; k {
      var m = values.pop();
      return callback(null,m); }
}

async.parallel(funcArr, function (err, resp){
  console.log(resp)
});
console.log("values..", values);

以上结果为

[ 4, 3, 2, 1 ]
values.. []

每个函数都是去 values 中取值,随后该值就从 values中删掉。所以最后 values 的值为空数组。

你可能感兴趣的:(node)