Phonegap db.transaction回调多次触发

时间:2012-12-03 13:52:40

标签: javascript cordova asynchronous

我正在处理使用phonegap

的项目的问题

[第1步] - 我从Web服务器本地存储用户登录“会话”(Web SQL)。这工作正常,我可以成功连接到Web服务器,发布用户登录数据,从服务器获取响应,创建本地用户数据库并存储用户“会话”值

[步骤2] - 然后我需要将此“会话”值传递回Web服务器,并从服务器接收响应数据。同样,这可以按预期工作,但问题是,回调函数正在执行两次

当用户点击屏幕上的按钮时,会调用

步骤2 ,如果因为phonegap,它似乎不是因为 Step 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回调的最后一行打开一个弹出对话框。这个对话被召唤两次。

我注意到phonegap有很多异步行为,我理解这是为了防止系统感觉“滞后”,但肯定不应该多次在db.transaction上执行回调函数?< / p>

2 个答案:

答案 0 :(得分:2)

您的回调被调用两次,因为您将它传递给executeSql命令和transaction。将其从一个中删除,使其按预期工作。

答案 1 :(得分: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
    }

我仍然有兴趣看看是否有人有更好的解决方案!