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

标签 javascript jquery ajax promise

我正在运行一段 javascript 来运行 Ajax 调用(以 XML 形式返回),处理该 XML,然后对 XML 中找到的每个“记录”执行另一个 Ajax 调用(删除记录),然后一旦所有内容都完成了已完成,刷新页面。

这工作正常,但我无法让 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();
});

最佳答案

您需要收集在循环中创建的每个 Promise,然后可以使用 $.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 为您收集 promise 可能会更简洁:

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

});

关于javascript - 等待未知数量的$.get完成,然后刷新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40386870/

相关文章:

asp.net - 哪些移动浏览器支持 javascript(和 Ajax)?

ajax - 初始化 youtube api 以定位 ajax 加载的 iframe

javascript - 3d 立方体未完美显示

javascript - 在输入字段之前提取表格单元格中的文本

jquery - 使用 jquery 禁用输入类型 ="image"的正确方法是什么?

jQuery - 获取附加到其他类的样式元素

javascript - React如何链接 `useEffect`钩子(Hook)中的依赖关系到状态?

Javascript:检索具有ID的元素内的隐藏字段值

javascript - 需要帮助来使用 JS 检索元素数组

java - 检查组模型中的 Wicket CheckGroup Ajax 口是心非