Javascript 从异步回调函数将对象推入本地数组
我在服务器上使用node.js,并使用redis key store存储有关我的角色的数据。每一种联系都有它自己的特点。我想将有关字符的所有数据(人物、姓名、年龄、职业等)放入字符数组,这样我就可以有选择地将其发送到连接的客户端Javascript 从异步回调函数将对象推入本地数组,javascript,node.js,asynchronous,redis,Javascript,Node.js,Asynchronous,Redis,我在服务器上使用node.js,并使用redis key store存储有关我的角色的数据。每一种联系都有它自己的特点。我想将有关字符的所有数据(人物、姓名、年龄、职业等)放入字符数组,这样我就可以有选择地将其发送到连接的客户端 var Characters = []; for (var ID in Connections) { redis_client.HGETALL(ID, function(err, result) { if (result) {
var Characters = [];
for (var ID in Connections) {
redis_client.HGETALL(ID, function(err, result) {
if (result) {
Characters.push(result);
}
});
}
console.log(Characters);
我读过,这是由于异步与同步的问题,所以我制作了全局变量字符
//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
有不同的方式 最简单的方法是创建一个接一个地调用异步函数,如下所示
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);
});
}
var Characters=[];
var objectKeys=Object.keys(连接);
var-ID=0;
if(ID
当您使用异步调用和全局变量时,常规for循环无法正常工作。这是一个可行的循环版本(请确保安装了async。如果没有安装,请执行“npm install async”):
var async=require('async');
变量字符=[];
每个(连接、函数(ID、回调){
redis_client.HGETALL(ID,函数(err,result){
如果(结果){
字符。推送(结果);
}
回调(空);
});
},函数(err){//循环完成时调用此函数
console.log(“finish:”);
//打印出你的数组
for(变量i=0,len=Characters.length;i
async。每个都不会通过连接阵列进行交互。我有:for(连接中的ID){console.log(ID);},这会打印连接中对象的键。在这个命令下,我有async.each(Connections,…但它不会做任何操作,即使前面的“for”打印一些键,它也只会打印“finish”。async.each()应该。您是否像答案中那样调用了callback(null)?如果没有,则为async.each()不会继续处理数组中的下一项这是我运行的示例,它按预期工作,只是没有使用HGETALL():var async=require('async');var Characters=[];var Connections=[1,2,3];async.each(Connections,function(ID,callback){Characters.push(ID);callback(null);},function(err){console.log(“finish:%d”,Characters.length);for(vari=0,len=Characters.length;ivar 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]);
}
});