1

次のJavaScriptコードで問題が発生しています。

        var returnValue = false;
        function hasItem(id) {
            //I want this entire function to run first
            db.transaction(function(tx) {
                tx.executeSql("SELECT * FROM library WHERE id == "+id,[],function(tx, results) {
                    returnvalue = results.rows.length>0; 

                },errorCB);
            },errorCB,successCB);

            //then this
            return returnvalue;
        }

しかし、sql-functionは別のスレッドで実行されているように見えるため、関数は常にfalseを返します。「強制的に待機する」方法はありますか。

4

1 に答える 1

3

「強制的に待つ」方法はありますか?

いいえ。あなたがしなければならないことはhasItem、値を返す代わりに、情報を提供するコールバックを受け入れるように関数を変更することです。

あなたerrorCBsuccessCBコールバックが何をするのかわからないのは少しトリッキーですが、これらの線に沿った何か:

function hasItem(id, callback) {
    var returnValue = false;
    db.transaction(function(tx) {
        tx.executeSql("SELECT * FROM library WHERE id == "+id,[],function(tx, results) {
            returnValue = results.rows.length > 0; 
        },failed);
    },failed,function() {
        successCB();
        callback(returnValue);
    });

    function failed() {
        errorCB();
        callback(null); // Or whatever you want to use to send back the failure
    }
}

そして、これの代わりに

if (hasItem("foo")) {
    // Do something knowing it has the item
}
else {
    // Do something knowing it doesn't have the item
}

次のように使用します。

hasItem("foo", function(flag) {
    if (flag) {
        // Do something knowing it has the item
    }
    else {
        // Do something knowing it doesn't have the item
        // (or the call failed)
    }
});

コールバックで、呼び出しが失敗したかどうかを伝えたい場合:

hasItem("foo", function(flag) {
    if (flag === null) {
        // The call failed
    }
    else if (flag) {
        // Do something knowing it has the item
    }
    else {
        // Do something knowing it doesn't have the item
    }
});
于 2013-02-25T09:37:17.353 に答える