0
function getUsernameAssociatedWithToken (token) {

    console.log('\n\t\tgetUsernameAssociatedWithToken');
    console.log("\t\t"+token);
    var userReturn = "";


    queryAsync(returnVal);

    function queryAsync(callback){
        connection.query("SELECT * FROM users WHERE token = '"+token+"'", function (error, results, fields) {

            if (error) {
                console.log(error);
                 callback(null);
            }

            if (results.length  > 0) {

                userReturn = results[0].user;
                callback(userReturn);


            } else {

                callback(null);
            }

        });
    };

    function returnVal(str){

    userReturn = str;
    console.log('vaaaaal');
    console.log(userReturn);

    }
    return userReturn;

}

最後の「リターン」は、クエリ関数が実行される前に呼び出されます(想定されていません)。コールバックを使用してこれを行うにはどうすればよいですか?

私はこれを試しましたが、これも失敗しました:

function getUsernameAssociatedWithToken (token) {

    console.log('\n\t\tgetUsernameAssociatedWithToken');
    console.log("\t\t"+token);
    var userReturn = "";




    function queryAsync(){
        connection.query("SELECT * FROM users WHERE token = '"+token+"'", function (error, results, fields) {

            if (error) {
                console.log(error);
                 return null;
            }

            if (results.length  > 0) {

                userReturn = results[0].user;
               return userReturn;


            } else {

                return null;
            }

        });
    };

return (queryAsync());

}
4

1 に答える 1

3

関数から非同期呼び出しの結果を直接返すことはできません。これは、(既に説明したように) 非同期呼び出しが完了する前に関数が返されるためです。代わりに、関数は、非同期呼び出しが完了したときに呼び出し元に結果を返すために呼び出すコールバック パラメーターをサポートする必要があります。

function getUsernameAssociatedWithToken (token, callback) {
    ...
    queryAsync(callback);
}
于 2013-01-10T20:19:46.147 に答える