0

我不知道如何进行两个单独的异步调用并使 call1 等待 call2 完成,一直在查找,我想我需要使用回调或承诺,但就是不明白,有没有人有链接到一个简单的解释?或者任何人都可以建议如何调整我的代码?

我已经“简化”了代码。

如何确保仅在constructButton 完成后才读取下一条记录?

function justAfunction(){
    var query = "SELECT * FROM trlydp where tdrexr = " + route + " order by tdrseq;";
    try {
        localDB.transaction(function(transaction){

            transaction.executeSql(query, [], function(transaction, results){
                for (var i = 0; i < results.rows.length; i++) {

                    var row = results.rows.item(i);

                    constructButton();
                }

            }, function(transaction, error){
                updateStatus("Error: " + error.code + "<br>Message: " + error.message);
            });
        });
    } 
    catch (e) {
        updateStatus("Error: Unable to select data from the db " + e + ".");
    }
}

function constructButton(){

  disabled = false;

  var query = 'SELECT * FROM trlylp';

  //alert(query);
  try {
    localDB.transaction(function(transaction){

      transaction.executeSql(query, [], function(transaction, results){
        alert(results.rows.length);
        if (results.rows.length != 0) {
          disabled = true;
        }

      }, function(transaction, error){
           updateStatus("Error: " + error.code + "<br>Message: " + error.message);
         });
      });
  } 
  catch (e) {
    updateStatus("Error: Unable to select data from the db " + e + ".");
  }

}
4

2 回答 2

0

有两种方法可以做到这一点。

1) 一个异步调用应该等待另一个异步调用完成。您可以通过在第一个函数的 onSuccess() 中调用第二个函数来做到这一点。

2)使第一次调用同步。(根本不推荐)因为它可能会使您的 GUI 看起来挂起。

function f1(){
    $.ajax({
        url: "blah blah",
        dataType: "json",
        complete: function(data){
           // do some action based on result
           f2();
        }
    })
}
于 2012-12-18T11:47:57.637 回答
-1

这是我使用 ajax 的方法,但是这个概念应该适用于所有需要在继续之前完成的任何异步工作集:

var model = {};

function checkLoadsComplete(){
    if (model.data0 && model.data1 && model.data2){
        //load Complete
        //do something
        return true;
    } else {
        //not done loading
        return false;
    }

}

function getData0(){
    $.ajax({
        url: "http://www.domain.com/data0.json",
        dataType: "json",
        complete: function(data){
            model.data0 = data;
            checkLoadsComplete();
        }
    })
}

function getData1(){
    $.ajax({
        url: "http://www.domain.com/data1.json",
        dataType: "json",
        complete: function(data){
            model.data1 = data;
            checkLoadsComplete();
        }
    })
}

function getData2(){
    $.ajax({
        url: "http://www.domain.com/data2.json",
        dataType: "json",
        complete: function(data){
            model.data2 = data;
            checkLoadsComplete();
        }
    })
}

$(document).ready(function(){
    if(!checkLoadsComplete()){
        getData0();
        getData1();
        getData2();
    }
})
于 2012-12-18T11:46:57.153 回答