javascript中的几个异步数据库调用

时间:2012-12-18 11:30:15

标签: javascript asynchronous

我无法弄清楚如何进行两个单独的异步调用并使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 + ".");
  }

}

2 个答案:

答案 0 :(得分:0)

有两种方法可以实现这一目标。

1)一个异步调用应等待另一个异步调用完成。您可以通过调用第一个函数onSuccess()中的第二个函数来完成此操作。

2)使第一个呼叫同步。 (根本没有推荐),因为它可能会让您的GUI看起来很糟糕。

function f1(){
    $.ajax({
        url: "blah blah",
        dataType: "json",
        complete: function(data){
           // do some action based on result
           f2();
        }
    })
}

答案 1 :(得分:-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();
    }
})