【问题标题】:Phonegap db.transaction callback firing more than oncePhonegap db.transaction 回调多次触发
【发布时间】:2012-12-03 23:04:18
【问题描述】:

我正在使用 phonegap 处理的项目遇到问题

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

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

Step 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 上多次执行回调函数吗?

【问题讨论】:

  • 顺便说一句:不是Phonegap 使WebSQL 异步——它总是这样,即使你在浏览器中运行它。这就是它的定义方式。
  • @IngoBürk 有趣。这是我第一次使用 WebSQL,我对它几乎一无所知,我一定要好好阅读一下它
  • 掌握异步内容需要一点时间,但这是值得的。 ;) 另一件事:如果您多次需要数据库连接(其他按钮或此按钮被多次调用),您可能需要考虑使用 window.openDatabase 进入更全局的范围,这样您就不必重新打开每次连接。

标签: javascript cordova asynchronous


【解决方案1】:

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

【讨论】:

  • 不,仍然不止一次触发
  • 您确定tap 事件不会以某种方式触发两次吗?一些控制台将相同的log 消息显示为一条消息,只是旁边带有一个“2”,表示它出现了两次。更新代码(只有一个回调)和更多的tap 事件可能会有所帮助,至少我现在找不到其他任何东西。
  • 还有,但这只是我个人,只是为了测试目的,我会尝试click 而不是tap 并检查它是否有区别。
  • 顺便说一下,live 在 jQuery 1.7 中已被弃用。请改用on。还要确保您只附加了一次事件处理程序——您不会是第一个意外附加两次或更多次的人。
  • 点击事件肯定只会被触发一次。明天我回来工作时我会搞砸它,如果我找到任何东西,我会告诉你的,谢谢 Ingo
【解决方案2】:

不是最优雅的解决方案,但我使用了全局变量

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
    }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多