我正在运行一段javascript来运行Ajax调用(以XML格式返回),处理该XML,然后为每个"记录"执行另一个Ajax调用。在XML中找到(删除记录),然后一旦完成所有事情,刷新页面。
这很好但我无法让Javascript等到所有迭代Ajax调用完成后再刷新页面。
在刷新页面之前等待所有迭代调用完成的最佳方法是什么?
任何" AVMI _"变量在别处定义。
var x = $.get(AVMI_childDB, { //******* INITIAL AJAX *******
act: "API_DoQuery",
query: AVMI_query,
clist: "3",
includeRids: "1"
});
x.then(function(xml1) {
console.dirxml(xml1);
$(xml1).find('record').each(function(){
var AVMI_record = $(this);
var AVMI_childRID = AVMI_record.attr("rid");
console.log(AVMI_childRID);
var y = $.get(AVMI_childDB , { //******* ITERATIVE AJAX CALL *******
act: 'API_DeleteRecord',
rid: AVMI_childRID
});
y.then(function(xml2) {
console.dirxml(xml2);
});
});
location.reload();
});
答案 0 :(得分:1)
由于每个.get()都返回一个promise,我建议你将这些promises推送到一个数组中。然后在功能结束时,您只需执行Promise.all(myArrayOfPromises).then(refreshThePage)
答案 1 :(得分:1)
您需要收集在循环中创建的每个承诺,然后您可以使用$.when()
知道它们何时完成:
var x = $.get(AVMI_childDB, { //******* INITIAL AJAX *******
act: "API_DoQuery",
query: AVMI_query,
clist: "3",
includeRids: "1"
});
x.then(function(xml1) {
console.dirxml(xml1);
var promises = [];
$(xml1).find('record').each(function(){
var AVMI_record = $(this);
var AVMI_childRID = AVMI_record.attr("rid");
console.log(AVMI_childRID);
var y = $.get(AVMI_childDB , { //******* ITERATIVE AJAX CALL *******
act: 'API_DeleteRecord',
rid: AVMI_childRID
}).then(function(xml2) {
console.dirxml(xml2);
});
promises.push(y);
});
$.when.apply($, promises).then(function() {
location.reload();
})
});
使用.map()
并让jQuery为您收集承诺可能会更清晰一些:
var x = $.get(AVMI_childDB, { //******* INITIAL AJAX *******
act: "API_DoQuery",
query: AVMI_query,
clist: "3",
includeRids: "1"
}).then(function(xml1) {
console.dirxml(xml1);
var promises = $(xml1).find('record').map(function(){
var AVMI_record = $(this);
var AVMI_childRID = AVMI_record.attr("rid");
console.log(AVMI_childRID);
return $.get(AVMI_childDB , { //******* ITERATIVE AJAX CALL *******
act: 'API_DeleteRecord',
rid: AVMI_childRID
}).then(function(xml2) {
console.dirxml(xml2);
});
}).get();
$.when.apply($, promises).then(function() {
location.reload();
})
});