将对象从asynchronouscallback函数中推入到本地数组中

我在我的服务器上使用node.js,并使用redis key-store来存储有关我的angular色的数据。 每个连接都有自己的特点。 我想把字符(人物,名字,年龄,职业等等)的所有数据都转换成字符数组,所以我可以有select地把它发送给连接的客户端。

var Characters = []; for (var ID in Connections) { redis_client.HGETALL(ID, function(err, result) { if (result) { Characters.push(result); } }); } console.log(Characters); 

我已经读过,这是由于asynchronousvs同步问题,所以我做了全局variables字符。

 //global variables var character; //function code var Characters = []; for (var ID in Connections) { redis_client.HGETALL(ID, function(err, result) { character = result; }); if(character) { console.log(character); // returns correct result // make copy of character Characters.push(JSON.parse(JSON.stringify(character))); character = undefined; } } console.log(Characters); // array of 1 character * number of connection //BUT I expect different character for each connection 

有不同的方法,

最简单的方法是创build一个接一个地调用asynchronous函数,如下所示

  var Characters = []; var objectKeys = Object.keys(Connections); var ID = 0; if (ID < objectKeys.length) doCall(objectKeys[ID]); else console.log(Characters); function doCall(key) { redis_client.HGETALL(key, function(err, result) { if (result) { Characters.push(result); } ID++; if ( ID < objectKeys.length) doCall(objectKeys[ID]); else console.log(Characters); }); } 

当你有asynchronous调用和全局variables时,正则循环不能正常工作。 这里是一个可以工作的循环版本(确保安装了async,如果不是“npm install async”):

 var async = require('async'); var Characters = []; async.each(Connections, function(ID, callback) { redis_client.HGETALL(ID, function(err, result) { if (result) { Characters.push(result); } callback(null); }); }, function(err) { // this function gets called when the loop is done console.log("finish:"); // print out your array for (var i = 0, len = Characters.length; i < len; i++) { console.log(Characters[i]); } });