javascript - 如何确定 jquery ajax 调用何时完成?

标签 javascript jquery html ajax

我有一个国家/地区下拉列表,并有一个 jquery ajax 调用,该调用用国家/地区名称填充下拉列表。问题是我需要知道调用何时完成,然后才能确定选择哪个国家/地区。也就是说,我在使用 ajax 调用的函数之后调用的任何函数都被调用得太快(在填充下拉列表之前),因此以下函数将崩溃。 我也不想使用 async=false (因为这会导致更多问题并且是不好的做法)。 实现这一目标的正确方法是什么?

这是一个通用的 ajax 函数,用于检索数据并使用参数 id 填充特定类型的选择下拉列表 (ddl):

   function RetrieveDD(ddl, ddtype, id) {
        var servicename;
        switch (ddtype) {
            case 'country':
                servicename = "LoadCountries";
                break;
            case 'state':
                servicename = "LoadStateProvinces";
                break;
            case 'city':
                servicename = "LoadCityLocalities";
                break;
            default:
                servicename = "";
        }
        if (servicename != "") {
             $.ajax({
                url: 'DDService.asmx/' + servicename,
                dataType: 'json',
                method: 'post',
                data: { ID: id },
                success: function (data) {
                    ddl.empty();
                    $.each(data, function (index) {
                        ddl.append($("<option" + (index == 0 ? " selected" : "") + "></option>").val(this['V']).html(this['T']));
                    });
                },
                error: function (err) {
                    console.log('Error (RetrieveDD): ' + JSON.stringify(err, null, 2));
                }
            });
        };
    };

我有一个执行此操作的测试按钮,并希望获取所选选项的值(这将调用以填充状态,获取第一个所选状态的值并再次调用以填充城市)。问题非常明显:在不知道前一个下拉列表的选定值的情况下,我不能说填充下一个下拉列表(因此我必须有办法等待下拉列表首先填充)。

        $('#btnTest').click(function () {
           RetrieveDD($("#ddlCountries"), "country", 0);

            var cid = $("#ddlCountries").val();  //this is still undefined because ajax call above not completed 
            alert("cid = " + cid);    //normally another call would be made here to populate the states
        });

单击该按钮时,您会立即看到弹出的警报框(没有 cid 值),并且只有在单击警报对话框中的 [确定] 按钮后才会填充国家/地区下拉列表。基本上,它的顺序是错误的。

如果我将async:false添加到ajax例程中,您将看到显示正确cid的警报,但是,正如人们已经发布的那样,您永远不应该使用async:false.我希望避免这种情况,但不确定如何正确执行此操作。 (如果有人想知道,我将从旧的 dotnet webforms 网站中删除所有 MSAjaxToolkit 垃圾,并用 jQuery ajax 替换 - 它更快、更小、更容易修复。)

这是 HTML 片段

    <input type="button" id="btnTest" value="Test" /><br />
    <div id="dd">
        <select id="ddlCountries"></select><br />
        <select id="ddlStates"></select><br />
        <select id="ddlCities"></select>
    </div>

**************** 回应为什么我相信这不是重复的 ********* 需要添加对旧版 IE 支持的要求(Windows 7、8、8.1 和某些服务器版本附带)。 IE 不支持箭头函数或 Promise(或 2015 年后的大多数 ECMA 方法),因此很多推荐的答案虽然很优秀,但不包含此类代码。我会尝试解决这个问题并发布在这里。

最佳答案

与John M的回答类似,但用法不同。

返回$.ajax promise 并使用.done()

if (servicename!="") 
    return $.ajax({...
// else return null

$('#btnTest').click(function () {
    var ajax = RetrieveDD($("#ddlCountries"), "country", 0);
    if (ajax) {  
        ajax.done(function(data) {  
            console.log('done');
        });
    }
});

关于javascript - 如何确定 jquery ajax 调用何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58876372/

相关文章:

javascript - 正则表达式字符恰好出现两次

javascript - 通过存储的数据获取 jQuery 元素

Javascript 32 位数字和运算符 & 和 >>>

javascript - 如何在 jQuery 的原型(prototype)函数中使用它?

javascript - 根据 URL 输入动态更改文本

c# - 有没有办法在 pdf 弹出窗口中隐藏保存选项

javascript - 使用 Jquery 将元素添加到页面时如何执行操作?

html - 内联矢量图像在表格单元格内换行

javascript - 单个浏览器选项卡中的多个 Javascript 解释器

javascript - 从 onChange 处理程序调用时使用错误的字段名称提交 HTML 表单