【问题标题】:Programm runs in a strange order?程序以奇怪的顺序运行?
【发布时间】:2013-10-16 11:42:01
【问题描述】:

我正在使用 phonegap 创建一个应用程序。我使用了一个小 jquery 和这个插件:html5sql.com/,用于处理数据库。我的程序以奇怪的顺序运行。我在代码中添加了一些警报,并在每个警报后面写了一条注释,其中包含我在设备上启动应用程序时出现的数字。有人知道为什么它不从上到下运行吗?

在 global.js 中

  • 我创建了一个函数,允许我创建一个新对象“站”
  • 我创建了一个包含三个 ID (relID) 的数组

    var station = function(id) {
        this.id = id;
    };
    
    var relID=new Array();
    relID[0]=2762378;
    relID[1]=2746459;
    relID[2]=2748307;

在 index.js 中

  • 我用 relID 数组作为参数调用 dbStuff()
  • 我将返回值保存在一个名为
  • 的变量中
  • 我提醒返回数组的第一个对象的品牌属性(作为注释,因为此时它当然是未定义的 - 但这是代码工作时我想要做的)
var app = {

    initialize: function() {
        this.bindEvents();
        alert('vor dbStuff() aufruf');//1-----
        var relStations=dbStuff(relID);
        alert('nach dbStuff() aufruf');//6-----
        //alert(relStations[0].brand); ---UNDEFINED---
    },
    ...phonegap stuff...

在 loaddb.js 中

  • 我创建了一个函数 'dbStuff()' 这应该:
  • 创建新的/打开的数据库并在其中写入内容
  • 从该数据库中读取并将这些值写入工作站对象 (对于每个 relID[])
  • 将所有车站对象放入一个数组并返回
function dbStuff(relID) {   
    //NEW ARRAY WHERE ALL STATION OBJECTS WILL BE SAVED  
    var relStations=[];

    alert('dbStuff() neues Array erstellt');//2-----

    //OPEN DATABASE AND WRITE DATA INTO
    try {
    html5sql.openDatabase("stations", "stations", 5 * 1024 * 1024);

    alert('open DB');//3-----

    $.get('js/db/stations.sql', function(dump) {

        alert('sbStuff() dump geladen');//7-----

        html5sql.process(
            dump, 
            function() { //Success
                alert('dump success');
            },
            function(error, failingQuery) { //Failure
                alert('dump fail'); //14-----
            }
        );

    });
    }
    catch (error) {
        alert("Error: " + error.message);
    }

    //GET DATA FROM DATABASE AND WRITE IT IN A STATION OBJECT
    //(FOR EACH ID IN 'relID' ARRAY)
    //FILL 'relStations' ARRAY WITH THE STATION OBJECTS AND RETURN IT
    for(var i=0; i<relID.length; i++){

        var stationa=new station(relID[i]);

        alert('dbStuff()-for neues station Objekt erstellt');//4-----

        //ARRAY WITH SQL STATEMENTS 
        var sqlarray = [
            {"sql" : "SELECT latitude FROM stations WHERE id=" + relID[i],
            "data" : [],
            "success" : function (tx, rs) {stationa.latitude=rs.rows.item(0).latitude;alert('SQL lat');//8-----
            }
            },
            {"sql" : "SELECT longitude FROM stations WHERE id=" + relID[i],
            "data" : [],
            "success" : function (tx, rs) {stationa.longitude=rs.rows.item(0).longitude;alert('SQL long');//9-----
            }
            },
            {"sql" : "SELECT brand FROM stations WHERE id=" + relID[i],
            "data" : [],
            "success" : function (tx, rs) {stationa.brand=rs.rows.item(0).brand;alert('SQL brand');//10-----
            }
             },
             {"sql" : "SELECT name FROM stations WHERE id=" + relID[i],
             "data" : [],
             "success" : function (tx, rs) {stationa.name=rs.rows.item(0).name;alert('SQL name');//11-----
             }
             },
             {"sql" : "SELECT federalstate FROM stations WHERE id=" + relID[i],
             "data" : [],
             "success" : function (tx, rs) {stationa.federalstate=rs.rows.item(0).federalstate;alert('SQL federalstate');//12-----
             }
             }
         ];

        try {html5sql.process(
            sqlarray,
             function () { //Success 
                 //alert('lat: ' + stationa.latitude + ', long: ' + stationa.longitude + ', brand: ' + stationa.brand + ', name:' + stationa.name + ', fedeeralstate:' + stationa.federalstate);
                 relStations[i]=stationa;
                 alert('Array füllen');//13-----
                 //alert(relStations[i].brand);
             },
             function () { //Failure
                alert('SQL FAIL');
             });}
             catch(error) {
            alert("Error: " + error.message);
        }

    }
    alert('return relStations'); //5-----
    return relStations;
}

【问题讨论】:

  • 是所有警报都不清楚还是只是一些特定的数字?
  • 我认为这是因为 get() 方法不会在其他所有内容加载之前运行。所以新的问题是:如何在页面加载之前进行 ajax 请求?
  • 为什么要在页面加载之前做一个ajax请求?你不能用页面本身加载那些东西吗?
  • 我预计订单是 ...3,7,14...!?
  • 是的,这就是我在回答中的意思。我会尽量澄清。

标签: javascript jquery database sqlite cordova


【解决方案1】:

这可能是因为回调函数必须等待脚本结束才能被调用。

alert 3 之后的get-function 会运行,但它的回调函数只有在服务器向 get 函数返回某些内容时才会运行,这可能需要一些时间。同时函数后面的代码会运行,因为它是一个异步请求。
所以你会看到alert 4, 5 and 6,之后请求已经被服务器处理了,并且(匿名)回调函数被调用,它会提醒alert 7 .

其他 ajax 调用也是如此。

您可以尝试以下方法。我将一些东西移到了函数 loadStations 中。 该函数将在您的get-call 的回调函数中调用,但仅限于成功的情况下。

function dbStuff(relID) {   
    //NEW ARRAY WHERE ALL STATION OBJECTS WILL BE SAVED  
    var relStations=[];

    alert('dbStuff() neues Array erstellt');//2-----

    //OPEN DATABASE AND WRITE DATA INTO
    try {
    html5sql.openDatabase("stations", "stations", 5 * 1024 * 1024);

    alert('open DB');//3-----

    $.get('js/db/stations.sql', function(dump) {

        alert('sbStuff() dump geladen');//7-----

        html5sql.process(
            dump, 
            function() { //Success
                alert('dump success');

                return loadStations(relID);
            },
            function(error, failingQuery) { //Failure
                alert('dump fail'); //14-----
            }
        );

    });
    }
    catch (error) {
        alert("Error: " + error.message);
    }
}

function loadStations(relID) {

    //GET DATA FROM DATABASE AND WRITE IT IN A STATION OBJECT
    //(FOR EACH ID IN 'relID' ARRAY)
    //FILL 'relStations' ARRAY WITH THE STATION OBJECTS AND RETURN IT
    for(var i=0; i<relID.length; i++){

        var stationa=new station(relID[i]);

        alert('dbStuff()-for neues station Objekt erstellt');//4-----

        //ARRAY WITH SQL STATEMENTS 
        var sqlarray = [
            {"sql" : "SELECT latitude FROM stations WHERE id=" + relID[i],
            "data" : [],
            "success" : function (tx, rs) {stationa.latitude=rs.rows.item(0).latitude;alert('SQL lat');//8-----
            }
            },
            {"sql" : "SELECT longitude FROM stations WHERE id=" + relID[i],
            "data" : [],
            "success" : function (tx, rs) {stationa.longitude=rs.rows.item(0).longitude;alert('SQL long');//9-----
            }
            },
            {"sql" : "SELECT brand FROM stations WHERE id=" + relID[i],
            "data" : [],
            "success" : function (tx, rs) {stationa.brand=rs.rows.item(0).brand;alert('SQL brand');//10-----
            }
             },
             {"sql" : "SELECT name FROM stations WHERE id=" + relID[i],
             "data" : [],
             "success" : function (tx, rs) {stationa.name=rs.rows.item(0).name;alert('SQL name');//11-----
             }
             },
             {"sql" : "SELECT federalstate FROM stations WHERE id=" + relID[i],
             "data" : [],
             "success" : function (tx, rs) {stationa.federalstate=rs.rows.item(0).federalstate;alert('SQL federalstate');//12-----
             }
             }
         ];

        try {html5sql.process(
            sqlarray,
             function () { //Success 
                 //alert('lat: ' + stationa.latitude + ', long: ' + stationa.longitude + ', brand: ' + stationa.brand + ', name:' + stationa.name + ', fedeeralstate:' + stationa.federalstate);
                 relStations[i]=stationa;
                 alert('Array füllen');//13-----
                 //alert(relStations[i].brand);
             },
             function () { //Failure
                alert('SQL FAIL');
             });}
             catch(error) {
            alert("Error: " + error.message);
        }

    }
    alert('return relStations'); //5-----
    return relStations;

}

【讨论】:

  • 好的,但我希望代码在服务器返回文件之前中断。代码在返回并执行 get 回调之前运行并执行 alert(4, ...) - 这不是我想要的。
  • 那么这也可以移动到回调函数中。可能有更好的选择,但我目前还不足以提出建议。
  • 是的,我想你明白了!不幸的是,我现在必须解决这个问题(stackoverflow.com/questions/12319809/…),所以我不知道天气第一个问题肯定会解决。还是谢谢你!!!
  • @SvenKeinath 如果这是您问题的正确答案,请接受它,这样问题就不会出现在未回答的问题列表中,其他用户会知道它有解决方案。 (您甚至会因接受答案而获得一些声誉)
猜你喜欢
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2021-09-25
  • 1970-01-01
相关资源
最近更新 更多