0

phonegapを使用して取り組んでいるプロジェクトで問題が発生しています

[ステップ 1] - ユーザーのログイン「セッション」を Web サーバーからローカル (Web SQL) に保存しています。これは正常に動作しています。Web サーバーに正常に接続し、ユーザーのログイン データを投稿し、サーバーから応答を取得し、ローカル ユーザー データベースを作成し、ユーザーの「セッション」値を保存できます。

[ステップ 2] - 次に、この「セッション」値を Web サーバーに戻し、サーバーから応答データを受信する必要があります。繰り返しますが、これは期待どおりに機能しますが、問題は、コールバック関数が 2 回実行されることです。

ユーザーが画面上のボタンをタップすると、ステップ 2が呼び出されます。 phonegap がタップを複数回拾っているために、ステップ 2が 2 回呼び出される理由はないようです。

$(".yes_sync").live("tap", function(){
    console.log("tap!");
    ...

シングルタップイベントのみを記録します。

ユーザーがタップすると、私は呼び出しています:

var db = window.openDatabase("MVIdb", "1.0", "MVIsqlite", 200000);
db.transaction(getUserId, getUserIdFailed, getUserIdsSuccess);

getUserId、getUserIdFailed、および getUserIdsSuccess 関数は次のようになります。

function getUserId(tx){
    tx.executeSql("SELECT * FROM user WHERE id = '1'", [], getUserIdsSuccess,     getUserIdFailed);
}

function getUserIdFailed(tx, results){
    console.log("Error retrieving user session ID");
}

function getUserIdsSuccess(tx, results){
    console.log("Success retrieving user session ID");
    if(typeof results != 'undefined'){
        var return_value = results.rows.item(0).user_id; 
        user_session_id = return_value;
        var token = $.md5(user_session_id+"whatever!");

        $.get('http://localhost/project/dummyserver/sync?user_id=' + user_session_id + '&token=' + token, function(data) {  
            data = $.parseJSON(data);       
            for (var key in data){
                console.log(data[key]['user_id']);
            }

            $(".ui-loader").fadeOut();
            jQuery.mobile.changePage("_sync_complete.html", {  role: "dialog", transition: "pop" } );
        });
    }
}

ご覧のとおり、成功のコールバックの $.get のコールバックの最後の行で、ポップアップ ダイアログが開きます。このダイアログは 2 回呼び出されています。

phonegap には多くの非同期動作があることに気付きました。これは、システムが「ラグ」を感じるのを防ぐためだと理解していますが、db.transaction でコールバック関数を複数回実行するべきではありませんか?

4

2 に答える 2

2

コールバックは、executeSqlコマンドとtransaction. 期待どおりに動作させるには、1 つから削除します。

于 2012-12-03T15:04:18.863 に答える
0

最もエレガントなソリューションではありませんが、グローバル変数を使用しました

var has_getUserIdsSuccess = false;

そして、コールバック関数で:

if(typeof results != 'undefined'){
    if (has_getUserIdsSuccess == false){ 
        has_getUserIdsSuccess = true;
        // as per above
        has_getUserIdsSuccess = false;  // set it back to false so use can press the execute this function again later
    }

誰かがより良い解決策を持っているかどうか、私はまだ興味があります!

于 2012-12-03T14:32:36.170 に答える