0

2つの別々の非同期呼び出しを実行し、call1にcall2が終了するのを待たせる方法がわかりません。調べてみました。コールバックまたはpromiseを使用する必要があると思いますが、取得できません。簡単な説明へのリンク?または、誰かが私のコードを調整する方法を提案できますか?

コードを少し「簡略化」しました。

次のレコードが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

これを行うには 2 つの方法があります。

1) 1 つの非同期呼び出しは、別の非同期呼び出しが完了するまで待機する必要があります。これを行うには、最初の関数の onSuccess() で 2 番目の関数を呼び出します。

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 に答える