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空欄。関数を呼び出すときに C# のように JavaScript が停止しないことを確認しました。これが期待どおりに機能するように、これをどのように書き直しますか?

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

私が追加したのは、返されたユーザー名の数が元の配列のユーザー ID の数と等しい場合にのみ、console.log へのコールバックの条件付きでした。これは、すべてのクエリが完了したことを示しています。

GetUserName でエラーが発生した場合にも対処する必要があります。これは、アプリケーションをクラッシュさせるだけでなく、エラーを処理することを計画していると仮定すると、console.log() が呼び出されない可能性があるためです。

于 2012-04-04T16:49:50.580 に答える
0

免責事項; 私自身は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);
                });
}
于 2012-04-04T16:00:38.293 に答える