Javascript Phonegap db.transaction回调多次触发

Javascript Phonegap db.transaction回调多次触发,javascript,cordova,asynchronous,Javascript,Cordova,Asynchronous,我对正在使用的项目有问题 [步骤1]- 我正在从Web服务器本地存储用户登录“会话”(Web SQL)。这工作正常,我可以成功连接到web服务器,发布用户登录数据,从服务器获得响应,创建本地用户数据库并存储用户“会话”值 [步骤2]-然后我需要将此“会话”值传递回web服务器,并从服务器接收响应数据。同样,这也可以正常工作,但问题是,回调函数执行了两次 当用户点击屏幕上的一个按钮时,第2步被调用。如果因为phonegap多次点击,则第2步似乎不会被调用两次,我尝试过: $(".yes_sync"

我对正在使用的项目有问题

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

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

当用户点击屏幕上的一个按钮时,第2步被调用。如果因为phonegap多次点击,则第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" } );
        });
    }
}
如您所见,美元回调中的最后一行。进入成功回调将打开一个弹出对话框。这一对话被要求进行两次


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

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

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
    }

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

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

顺便说一句:使WebSQL异步化的不是Phonegap,即使您在浏览器中运行它,也总是这样。这就是它的定义。@IngoBürk很有趣。这是我第一次使用WebSQL,我对它几乎一无所知,我一定要好好阅读一下它。要掌握异步的诀窍需要一点时间,但这是值得的另一个一般情况是:如果您需要多个数据库连接(其他按钮或这个按钮被多次调用),您可能需要考虑使用<代码>窗口.OpenDabase进行更全局的范围,因此您不必每次都重新打开连接。仍然不止一次触发您是否绝对确定
tap
事件不会以某种方式触发两次?一些控制台显示相同的
log
消息,旁边只有一个“2”,表示发生了两次。更新代码(只需一次回调)和更多的
点击
事件可能会有所帮助,至少我现在看不到其他任何东西。此外,这只是我,出于测试目的,我会尝试
单击
,而不是
点击
,并检查是否有区别。顺便说一下,自jQuery 1.7起,
live
已被弃用。改为在
上使用
。还要确保您只附加了一次事件处理程序——您不会是第一个意外附加两次或更多次的事件处理程序。tap事件肯定只触发一次。我明天回去工作的时候会把它弄得乱七八糟的,如果我发现了什么,我会告诉你的,谢谢你