Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从异步回调函数将对象推入本地数组_Javascript_Node.js_Asynchronous_Redis - Fatal编程技术网

Javascript 从异步回调函数将对象推入本地数组

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) {

我在服务器上使用node.js,并使用redis key store存储有关我的角色的数据。每一种联系都有它自己的特点。我想将有关字符的所有数据(人物、姓名、年龄、职业等)放入字符数组,这样我就可以有选择地将其发送到连接的客户端

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]); } });