Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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
Node.js 如何运行在循环中提取数据并在循环结束时获取数据的函数?_Node.js_Loops - Fatal编程技术网

Node.js 如何运行在循环中提取数据并在循环结束时获取数据的函数?

Node.js 如何运行在循环中提取数据并在循环结束时获取数据的函数?,node.js,loops,Node.js,Loops,这就是我要做的。我的第一个函数循环遍历一个用户ID数组,并构建一个用户名数组以显示在控制台中。这是在使用node.js function Function1(){ for (var i = 0; i < array.length; i++){ if (array[i] !== '') { GetUserName(votelog[i]); } } console.log(array2); } }

这就是我要做的。我的第一个函数循环遍历一个用户ID数组,并构建一个用户名数组以显示在控制台中。这是在使用node.js

function Function1(){
    for (var i = 0; i < array.length; i++){
        if (array[i] !== '') {
                GetUserName(votelog[i]);
        }
    }
    console.log(array2);
    }
}

function GetUserName(userid){
    client.query("SELECT `username` FROM " + config.database.tablenames.user + " WHERE `userid` = '" + userid + "'",
                function selectCb(err, results, fields) {
                    if (err) { throw err; }
                    console.log(results);
                    console.log(fields);
                    client.end();
                    array2.push(results.username);
                });
}

然而,array2是空白的。我已经看到JavaScript在调用函数时并不像C那样停止。我将如何重写此文件,使其按预期工作?

免责声明;我自己不太习惯JavaScript或节点。不管怎样,我的看法是这样的:

function Function1(){
    for (var i = 0; i < array.length; i++){
        if (array[i] !== '') {
            GetUserName(votelog[i], function(result) {
                array2.push(result);
            });
        }
    }
    console.log(array2);
}

function GetUserName(userid, callback){
    client.query("SELECT `username` FROM " + config.database.tablenames.user + " WHERE     `userid` = '" + userid + "'",
                function selectCb(err, results, fields) {
                    if (err) { throw err; }
                    console.log(results);
                    console.log(fields);
                    client.end();
                    callback(results.username);
                });
}

对此有几个答案,正确的方法可能是不要像那样单独获取每个用户名,而是编写查询以一次返回所有用户名。如果要保留单个用户名查询,可以执行以下操作:

function Function1(){
    for (var i = 0; i < array.length; i++){
        if (array[i] !== '') {
            GetUserName(array[i], function(result) {
                array2.push(result);
                //  Verify that all of the results have come back
                if(array2.length == array.length) {
                    console.log(array2);
                }
            });
        }
    }
}

function GetUserName(userid, callback){
    client.query("SELECT `username` FROM " + config.database.tablenames.user + " WHERE     `userid` = '" + userid + "'",
    function selectCb(err, results, fields) {
        if (err) { throw err; }
        console.log(results);
        console.log(fields);
        client.end();
        callback(results.username);
    });
}
我添加的是对console.log回调的条件,仅当返回的用户名数等于原始数组中的用户名数时,才记录结果。表示所有查询都已完成


您还必须处理GetUserName中出现错误的情况,因为这可能导致永远不会调用console.log,前提是您计划处理错误,而不是让它使应用程序崩溃。

在收到所有结果之前,这仍将调用console.logarray2。