1

这是我想要做的。我的第一个函数循环遍历一组用户 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# 那样停止。我将如何重写它以使其按预期工作?

4

2 回答 2

2

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

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 回调的条件,仅当返回的用户名数量等于原始数组中的用户 ID 数量时。这表明所有查询都已完成。

您还必须处理 GetUserName 中存在错误的情况,因为这可能会导致 console.log() 永远不会被调用,假设您计划处理错误而不只是让它崩溃您的应用程序。

于 2012-04-04T16:49:50.580 回答
0

免责声明;我自己不太习惯 JavaScript(或 Node)。无论如何,我的看法可能是这样的:

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);
                });
}
于 2012-04-04T16:00:38.293 回答