Jquery链异步方法使用它们同步

时间:2017-07-20 16:57:25

标签: javascript jquery asynchronous

如何在jquery /或javascript中运行异步代码同步?

我正在使用EC5和Jquery 1.8

我有3个下拉列表;
- 城市
- 县
- 地区

我为第一个选择分配了一个jquery事件,名为id:“CityId”。当用户选择城市时,我需要将CountyId(2.dropdown)值设置为零。并且“showHideDistrictSelection”方法查找选定的CityId和选定的区域以决定是否显示区域。

问题是,在将CountyId值设置为0 之前,函数“showHideDistrictSelection”的工作速度非常快。这是代码;

    $("#CityId").change(function () {

        $("#CountyId").val("0");
        showHideDistrictSelection("#DistrictArea");

    });

所以我改变了这样的事件功能;

        $("#CityId").change(function () {
            $("#CountyId").val("0");

            setTimeout(function() {
                showHideDistrictSelection("DistrictArea");
            }, 200);
        });

现在它正在运行,但我确定这不是最佳做法。我认为我在这里遇到异步问题。那我需要什么?延迟对象done(),when(),promise()函数等?或其他事件?我正在使用jquery但是如果你想提供一些代码,那么vanilla js也可以。

我会很高兴任何评论(更改你的问题的标题,改变你的问题,做到这一点,做出那样的等等)。

更新,我添加了show / hide区功能;

function showHideDistrictSelection() {
    var selectedCityText = $('#CityId :selected').text().toLowerCase();
    var selectedCountyId = $("#CountyId :selected").val();
    var $districtDropDownList = $("#DistrictId");

    if (selectedCityText.endsWith("w york") && selectedCountyId > 0) {
        $("#DistrictArea").show();

        $.ajax({
            cache: false,
            type: "GET",
            url: addressUrls.GetDistricts,
            data: { countyId: selectedCountyId },
            success: function (data) {
                $districtDropDownList.html("");
                $("#DistrictId").append("<option value='0' selected='selected'>Select (*)</option>");
                for (var i = 0; i < data.length; i++) {
                    $districtDropDownList.append("<option value='" + data[i].id + "'>" + data[i].name + "</option>");
                }
            }
        });
    }
    else {
        $("#DistrictArea").hide();
        $('#DistrictId').val("0");
    }
}

所以函数showHideDistrictSelection工作得非常快,在更改事件之前我将CountyId值设置为0 ...;我的意思是,当我通过$(“#CountyId:selected”)得到selectedCountyId时.val();我仍然将CountyId大于0.因为$(“#CountyId”)。val(“0”);没完成工作。

抱歉,我有点试图清楚地定义问题。

0 个答案:

没有答案