2

問題が発生しているかなり単純な getUser メソッドがあります。私はJSのスコープなどに詳しくないので、頭が痛いです。基本的に、データベースからオブジェクトを取得し、それを呼び出し元のメソッドに返します。

function getUser(uid)
{
    var result = null;

    var userTable = tables.getTable('Users');

    userTable.where({
        userId: uid
    }).read({
        success: function (results) {
            if (results.length > 0) {
                result = results[0];
                console.log('userid'+result.id);
            }
        }
    });
    console.log('userid-'+result.id); // undefined!!
    return result;
}

また、success 内から戻ると、getUser からは返されず、内部で定義された関数だけが返されます。「result = function(results)」も試しましたが、戻り値ではなく、定義された関数が格納されます。

どうすればいいですか?

4

2 に答える 2

0

データベースへの呼び出しは非同期であるため、データベースの呼び出しが実際に終了する前に、最後の 2 行が実行されます (結果は未定義です)。したがって、成功のコールバック内ですべてを処理する必要があります。または、getUser()func がヘルパーの場合、コールバックを使用して次のように (再帰なしで) コードを構成できます。

function insertOrWhateverCallingMethod()
{
    var uid = 'blah';

    getUser(uid,function(user) {
        // Do something with the user object
    });

}

function getUser(uid,callback)
{
    var result = null;

    var userTable = tables.getTable('Users');

    userTable.where({
        userId: uid
    }).read({
        success: function (results) {
            if (results.length > 0) {
                result = results[0];
                console.log('userid'+result.id);
                callback(result);
            }
        }
    });
    callback(null);
}

上記のコードは、tablesオブジェクトが使用可能なテーブル スクリプトにいることを前提としています。そうでない場合は、パラメータとして に渡すことができますgetUser()

于 2014-01-21T18:08:29.070 に答える
0

他の場所でこれに対する解決策を見つけました。実際には (私の理解では)、非同期関数を使用する JavaScript 内でこれを行うことはできません。あなたがする必要があるのは、代わりに成功ハンドラー内から再帰を作成することです。

于 2014-01-21T11:29:55.867 に答える