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