为什么变量只在事务函数中有最后一个返回值,执行N次?

时间:2012-12-08 13:17:36

标签: jquery sqlite cordova

我正在开发一个使用sqlite数据库的phonegap应用程序。该数据库的唯一更新将涉及其内容而不是其方案。

保持本地sqlite数据库更新的方法是:

  1. 有一个带有两列的远程数据库:'id'和'sql_sentence'。它存储要在本地执行的sql_sentences集,以便更新本地sqlite db。

  2. 本地我有一个var'local_max_id',它保存了本地执行的最后一个sql_sentence的id。第一次运行应用程序时,其值为0.

  3. 每次应用启动时,它会将“local_max_id”的值与远程数据库的“id”列中的最高值进行比较。

  4. 如果值匹配,则本地数据库是最新的。否则,我必须检索id大于'local_max_id'的sql_sentences集,执行它并将'local_max_id'更新为最后收到的行id。

  5. 执行此操作的代码(有一些西班牙语消息,但我试图用英语提供必要的信息):

    var min_id;
    var local_max_id=0;
    var sentencia_sql   = "";
    
    function initDB(){
            //Just to make sure it requests the database info. Out when in production 
            window.localStorage.setItem("local_max_id", 0);
    
            // Used to see which has been the last sql_sentence id executed locally  
            local_max_id    = window.localStorage.getItem("local_max_id");
    
            //Call to retrieve the highest id in remote database
            $.post("http://mytests.es/phonegap-db/get-db.php", {exec:"max_id"}, treat_max_id, "json");
    }
    
    
    //Method that decides what to do depending on returned remote_max_id value and local_max_id.
    function treat_max_id(remote_max_id){
        if(remote_max_id > local_max_id){
            $.post("http://mytests.es/phonegap-db/get-db.php", {exec:"get_sentencias", "min_id":local_max_id}, 
                function(res) {
                    if(res){
                        for(j=0;j<res.length;j++){
                            sentencia_sql   = res[j].sentencia;
                            alert(sentencia_sql);
                            //The problem is here. While the alert shows the proper sql_sentence of each iteration, this variable (sentencia_sql) only has the last returned value inside transaction function, but is executed N times (being N the amount of returned sql_sentences)
                            transaction(
                                function(tx){
                                    console.log(sentencia_sql);
                                    tx.executeSql(sentencia_sql);   
                                },
                                errorDB,
                                succesDB2
                            );
                        }
                        window.localStorage.setItem("local_max_id", remote_max_id);
                    }
                    else{
                        console.error("No se ha recuperado resultado de get-db.php/get_sentencias");
                    }
                },"json"
            );
        }
    }
    

    使用要执行的N sql语句处理结果的循环以一种我难以理解的方式运行。即使本地执行sql语句的方法'transaction'在循环内部并且每个接收到的行执行一次,变量'sentencia_sql'总是具有相同的值,即最后收到的sql语句。

    这是正常的吗?我应该使用任何指令来控制这种异步行为吗?

1 个答案:

答案 0 :(得分:0)

异步JavaScript需要一些时间来习惯 - 代码不会按照它编写的顺序运行,并且循环的所有迭代共享相同的范围。

Adding rows to a sqlite database using a loop (Phonegap)