【问题标题】:How to check AJAX call is completed如何检查 AJAX 调用是否完成
【发布时间】:2013-05-15 07:32:00
【问题描述】:

我有一个页面,我必须通过 ajax 调用绑定几个控件。 国家下拉,州根据所选国家下拉,城市下拉根据所选城市。嵌套数据绑定工作正常。

但是如果我有一些国家、州、城市的初始值并且我必须设置选定的值,那么这不起作用。我正在调用一个函数来设置如下初始值:

function bindandsetvalues(_country, _state, _city){

  // function to bind countries via ajax call. ajax logic is inside this function
  bindcountries();

  if($("#country").length > 0){
    // set selected country
    $("#country").val(_country);

    // function to bind states via ajax call. ajax logic is inside this function
    bindstates(_country);

    if($("#state").length > 0){
      // set selected state
      $("#state").val(_state);
    }
  }
}

但只有国家下拉列表被填充。国家集的初始值和状态下拉列表都不绑定。

我也找到了原因。 调用 bindcountries() 函数后,控制转到 bindcountries() 函数。但是在 bindcountries() 函数内部有一个异步 ajax 调用,所以在调用 ajax 调用之后,控制权返回到调用者函数,而无需等待我调用的 ajax 调用完成

$("#country").val(_country);

但是由于 ajax 异步调用仍在进行中,并且国家/地区下拉列表将在完成 ajax 调用后绑定和呈现。

因此,国家集的初始值和状态下拉列表都不绑定。 所以,我的问题是:有什么方法可以检查或等待 AJAX 异步调用的完成,以便在那之后检查渲染控件的存在 ($("#state").length > 0)/完成 ajax 调用。

我知道 jquery ajax 有 .done、.fail 和 .always 方法,我可以在其中处理后 ajax 调用逻辑。但在上述情况下,我不能使用这些方法。 & 我必须设置超过 8 个这种类型的嵌套控件。

请给我一个解决方案。

【问题讨论】:

  • 也许在最后添加一个警报?

标签: jquery ajax


【解决方案1】:

你可以使用 .done()

$.ajax({
  url: "url",
  context: document.body
}).done(function() {
  //Write your code here
});

【讨论】:

  • 我使用上面的函数来填充我的下拉框,但是当我在数据库表中有超过 2000 行时,页面加载需要太多时间......我把 $.ajax() 函数放在里面document.ready 函数。那么如何使这个过程快速任何想法??
  • 对不起,我不知道
  • 感谢 PSR,但正如我已经提到的,我只能在 .done 函数中编写绑定和呈现国家/地区下拉列表的逻辑。渲染国家下拉列表后,我必须设置国家选择值(好的,我可以在 .done 中完成)然后在国家选择值的基础上,AJAX 调用状态下拉列表将被初始化。 &还有其他一些信息,我必须设置只有&只有当状态/城市/其他一些字段呈现时。如果某些字段由于数据不可用而未呈现/绑定,则进一步的 AJAX 调用将停止并且我们不会设置这些字段的值。
【解决方案2】:

您可以使用 .done.success 方法,例如

$.ajax({
  url  : my_url,
  data : data,
}).done(function() {
   alert('Ajax completed');
});

利用成功

$.ajax({
  url  : my_url,
  data : data,
  success : function(){
      alert('Successfully completed ajax');
  }
});

【讨论】:

  • 有没有其他方法可以确定 AJAX 是否完成。因为我不能在 .done/.fail/.always 函数中编写该代码。因为所有下拉菜单也有它们的“更改”事件,该事件将相应地触发并绑定下一个子元素。但最初,我必须设置一些初始值,所以我必须通过自动化流程手动触发/或绑定所有子控件。
  • 是的,如果你选择“成功”,如果 ajax 成功完成,那么它将触发相关函数
【解决方案3】:

你也可以这样检查

 $.ajax({
   url: "url",
   statusCode: { 
          200: function() {
          alert("Ajax call successfully completed");
       }

  });

【讨论】:

  • 有没有其他方法可以判断一个 AJAX 是否完成。
【解决方案4】:

你可以这样检查:

$.ajax({
            type: "POST",
            dataType: 'json',
            url: url,
            contentType: "application/x-www-form-urlencoded",
            data: request,
            xhrFields: {
                withCredentials: true
            },
            success: function(data){
            //it will be called if everything its ok                    
            },
            error:  function (data) {
              //it will be called if there is something bad in your server                   
            }
        });

其中“数据”有您对方法和参数的请求。

希望对你有帮助。

胡安尼托斯

【讨论】:

  • 感谢 Juanita,但我对 AJAX 调用或 .done/.fail/.always 函数没有任何问题。有没有其他方法可以确定 AJAX 是否完成。因为在此基础上,我必须做一些我不能在 .done/.fail/.always 函数中做的其他处理,例如:用户保存了他的个人资料并转到编辑部分。现在我必须绑定保存的信息。在这里,我的上述过程将起作用。当用户来注册时,我们不会预先填充数据(国家、州、城市等)。他们将独立触发他们的“更改”事件,并且不需要嵌套的 AJAX 调用。
【解决方案5】:
<script>
    function FillState() {
        var countryId = $('#CountryId').val();
        $.ajax({
            url: '/Student/FillState',
            type: "GET",
            dataType: "JSON",
            data: { countryId: countryId },
            success: function (states) {
                $("#StateId").html(""); // clear before appending new list
                $.each(states, function (i, state) {
                    $("#StateId").append(
                        $('<option></option>').val(state.Id).html(state.Name));
                });
            }
        });
    }
</script>




public ActionResult FillState(int countryId = 0)
        {
            db.Configuration.ProxyCreationEnabled = false;
            var states = db.States.Where(x => x.CountryId == countryId).ToList();
            return Json(states, JsonRequestBehavior.AllowGet);

        }


 ViewBag.StateId = new SelectList(db.States.Where(x => x.CountryId == studentDetail.CountryId), "Id", "Name", studentDetail.StateId);


ViewBag.StateId = new SelectList(db.States.Where(x => x.CountryId == 0), "Id", "Name");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多