等到$ .get的未知数量完成,然后刷新页面

时间:2016-11-02 18:08:10

标签: javascript jquery ajax promise

我正在运行一段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();
});

2 个答案:

答案 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();
    })

});