数组为空,for循环后未添加数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组为空,for循环后未添加数据相关的知识,希望对你有一定的参考价值。

我第一次使用redis和nodejs,但没有成功。尝试循环插入数据,但得到一个空数组。

const redis = require("redis");

const client = redis.createClient(
  retry_strategy: function(options) 
    if (options.error && options.error.code === "ECONNREFUSED") 
      // End reconnecting on a specific error and flush all commands with
      // a individual error
      return new Error("The server refused the connection");
    
    if (options.total_retry_time > 1000 * 60 * 60) 
      // End reconnecting after a specific timeout and flush all commands
      // with a individual error
      return new Error("Retry time exhausted");
    
    if (options.attempt > 10) 
      // End reconnecting with built in error
      return undefined;
    
    // reconnect after
    return Math.min(options.attempt * 100, 3000);
  ,
);

var data_value = 
        id: '235235',
        totalrv: 'WAIT',
        product: 'productName2',
        url: 'url2',
        process: 'proc',
        task: 'msg'
    ;

client.set("key0", JSON.stringify(data_value));
client.set("key1", JSON.stringify(data_value));
client.set("key2", JSON.stringify(data_value));
client.set("key3", JSON.stringify(data_value));
client.set("key4", JSON.stringify(data_value));

//client.get("key2", redis.print);

var logger_data = 
        logger: []
    ;

client.keys('*', function (err, keys) 
    if (err) return console.log(err);

    for(var i = 0, len = keys.length; i < len; i++) 
        var values_v = client.get(keys[i].toString(), function(err, val) 
            // console.log(logger_data);
            // data is exist ...
            logger_data.logger.push(JSON.parse(val));
        );
    
);

// empty data
console.log(logger_data);

我写了2个打印数据结果,在循环中可以正常工作,但是函数结束了,数组中没有数据。

答案

如果要使用异步回调外部的值来打印logger_data,则可以在回调内部调用函数,例如这样

function printLoggerData()
 console.log(logger_data);


client.keys('*', function (err, keys) 
    if (err) return console.log(err);

    for(var i = 0, len = keys.length; i < len; i++) 
        var values_v = client.get(keys[i].toString(), function(err, val) 
            // console.log(logger_data);
            // data is exist ...
            logger_data.logger.push(JSON.parse(val));
            // calling the function here so that it contains the latest values
            printLoggerData(); 
       );
    
);
另一答案

好的,在SomePerformance的帮助下,它现在可以异步工作。非常感谢您...

async function getMessage () 
    var logger_data = 
        logger: []
    ;

    return new Promise(function(resolve, reject) 
        client.keys('*', function (err, keys) 
            if (err) return console.log(err);

            for(var i = 0, len = keys.length; i < len; i++) 
                var values_v = client.get(keys[i].toString(), function(err, val) 
                    logger_data.logger.push(JSON.parse(val));
                    resolve(logger_data);
                );
            
        );
    );


async function main() 
    let message = await getMessage();
    console.log(message);


main();

以上是关于数组为空,for循环后未添加数据的主要内容,如果未能解决你的问题,请参考以下文章

java将list集合中的for数据循环添加到String数组中

js如何使用for循环往json添加数据?

Navicat for MySQL循环添加大量数据用啥

Swift - 使用 for 循环将数据添加到核心数据

如何从 sqlite 数据库添加到 for 循环

js如何向数组里面添加数据和遍历出来数组里面的内容