0

我是 jquery mobile 的新手。

我的问题是首先,我必须从数据库中获取一个值(对于使用 fn toGetQuestionNumber 的 QnNumber),然后在 xmlParser 函数中使用该值。

如果以正确的顺序执行 - 警报应按顺序显示 - 第一、第二、第三。

但是显示的是警报以第二、第三、第一的形式出现。(意味着 db 函数 toGetQuestionNumber 仅在最后执行!)

如何让 toGetQuestionNumber 首先执行 - 所以我得到 QnNumber 的值 - 然后执行 xmlParser?

/////////////////////////////////////////

$('#alpha').live('pageshow', function(event) {
    var day         = getUrlVars()["day"];
    var module      = getUrlVars()["module"];

    var QnNumber=1;


        var db = openDatabase("Exam", "1.0", "The Exam", 200`enter code here`000);
        var dataset;
        var selectAllStatement = "SELECT  TotQn, TotAnswd FROM QuizScore where DayID=" + day + " and ModuleID=" + module ;

        function toGetQuestionNumber() {

            db.transaction(function(tx) 
            {
              tx.executeSql(selectAllStatement, [], function(tx, result) 
              {
                dataset = result.rows;
                for (var i = 0, item = null; i < dataset.length; i++) 
                {
                  item = dataset.item(i);
                  //if(item['TotAnswd']>0)
                  //{
                     QnNumber = item['TotAnswd'];
                     alert('First=' +QnNumber); ////// First Alert
                  //}
                }
              });
            });
      }


    toGetQuestionNumber();
      alert('Second' + QnNumber);  ////// Second Alert


    var xml;
    $(document).ready(function(){
        $.ajax({
            type: "GET",
            url: "data/quiz.xml",
            dataType: "xml",
            success: xmlParser
        });
    });


         //loading XML file and parsing to .main div.
       function xmlParser(data) 
        {
            xml = data;
            $('#list').empty();

             alert('Third' + QnNumber); ////// Third Alert
        }

    $('#list').trigger('create');


    });

///////////////////////////////////////// //////

4

1 回答 1

1

javascript永远不会停止

toGetQuestionNumber(); 将直接返回,它不会等待您的 tx.executeSql

所以,alert('Second' + QnNumber); 被首先调用

其次,在页面就绪回调中,您执行 ajax 请求,但这不是放置此就绪回调的地方

而不是做

.live
  .ready

.ready
  .live

请记住 javascript 是异步的,操作后有一些回调,例如 $.ajax 和 tx.executeSql

如果您想要在第一个操作之后调用第二个操作,请在第一个操作的结束回调时启动第二个操作

尝试这样的事情:

$(document).ready(function(){
$('#alpha').live('pageshow', function(event) {
    var day         = getUrlVars()["day"];
    var module      = getUrlVars()["module"];

    var QnNumber=1;

    var db = openDatabase("Exam", "1.0", "The Exam", 200`enter code here`000);
    var dataset;
    var selectAllStatement = "SELECT  TotQn, TotAnswd FROM QuizScore where DayID=" + day + " and ModuleID=" + module ;
    var xml;

    //loading XML file and parsing to .main div.
    function xmlParser(data) 
    {   // if here ajax request is end
        xml = data;
        $('#list').empty();
        alert('Third' + QnNumber); ////// Third Alert

        $('#list').trigger('create');
    }

    function toGetQuestionNumber() {
        db.transaction(function(tx) 
        {
            tx.executeSql(selectAllStatement, [], function(tx, result) 
            {
                dataset = result.rows;
                for (var i = 0, item = null; i < dataset.length; i++) 
                {
                  item = dataset.item(i);
                  //if(item['TotAnswd']>0)
                  //{
                      QnNumber = item['TotAnswd'];
                      alert('First=' +QnNumber); ////// First Alert

                      // if here, db request is end !

                      alert('Second' + QnNumber);  ////// Second Alert

                      // call ajax request

                      $.ajax({
                      type: "GET",
                      url: "data/quiz.xml",
                      dataType: "xml",
                      success: xmlParser
                      });
                  //}
                }
            });
        });
    }

    // start all
    toGetQuestionNumber();

});
});
于 2013-02-09T11:54:59.710 回答