1

我在一个脚本中有几个 ajax 请求,一些同步一些异步我使用 pload.gif 在 ajax 请求处于活动状态超过 1 秒时显示。我发现在一种情况下,即使请求成功并且预期的操作已完成,pload.gif 仍会继续显示。N:B:没有其他请求被触发,即 $.active = 1。但是 ajaxStop 没有触发此外我已经测试了 ajaxComplete 和 ajaxSuccess(不是我想要这些,因为我想捕获任何异步请求)并且这些也不会触发任何一个。

这是有问题的请求:

$.ajax({
    beforeSend: function(){
        $("#loading p").append("validate class schedules");
        console.log("validate class schedules");
    },
    type: "POST",
    url: "../_admin/admin_Validate_Class_Schedule.php",
    data: {class_Key: current_Class_Key, schedule_Key : current_Schedule_Key},
    dataType: "text",
    async: false,
    success: function(return_Data){
        console.log("success");
        var result = $.trim(return_Data);
        console.log("result: " + result + " " + "call count: " + call_Count + " : " + $("#schedule_Description").val() + " " + $("#schedule_Description").val().length + " " +  current_Class_Key);

        if (result == "exists"){
            $("#create_Schedule .form_Submit").attr("value", "Update Schedule");
            $("#create_Schedule").attr("action", "process_Schedule_Update.php");
            $(".form_Footer .form_Submit").css("color", "#fff");
            $(".form_Footer .form_Submit").removeAttr("disabled");                  
        } else {
            $("#create_Schedule .form_Submit").attr("value", "Create Schedule");
            $("#create_Schedule").attr("action", "process_Schedule_Create.php");
            $(".form_Footer .form_Submit").css("color", "red");
            $(".form_Footer .form_Submit").attr("disabled","disabled");             
            if ((current_Class_Key.length != 0) && ($("#schedule_Description").val().length != 0)){
                $(".form_Footer .form_Submit").css("color", "#fff");
                $(".form_Footer .form_Submit").removeAttr("disabled");
            }
        }   
    },
    error: function(){
        console.log("Validate Could not retrieve XML file.");
    }
});  // end ajax call

我的诱惑是在成功分支的末尾使用以下内容

if ($.active == 1){                // nothing else requested which should be the case
   $.event.trigger( "ajaxStop" );  // force a stop
   $.active = 0;                   // force active to zero as belt and braces as not
}                                  // sure if triggering stop will set active to zero

但是我不确定-这是否会为以后存储问题以及为什么无论如何都需要这样做。我不想在我的所有请求中都开始编码。我希望我的所有请求在完成后减少 $.active。所以我想真正的问题是为什么不是这样?

欢迎任何想法。

4

1 回答 1

1

也许不是直接回答你为什么它似乎没有触发的问题,但对于评论来说太长了,并且可能是解决你的问题的方法:

您可以使用 jQuery 的新延迟系统来附加 ajax 回调。jQuery 对象上的 ajax 调用返回一个延迟对象:

var dfd = $.ajax({
              beforeSend: function(){
                  $("#loading p")
                      .append("validate class schedules");
                  console.log("validate class schedules");
              },
              type: "POST",
              url: "../_admin/admin_Validate_Class_Schedule.php",
              data: {class_Key: current_Class_Key, schedule_Key : current_Schedule_Key},
              dataType: "text",
              async: false
          });

您可以使用deferred.then, deferred.done,将回调附加到该对象上deferred.fail

dfd.done(function(){
    // ajax succes, handle
});
dfd.fail(function(){
    // ajax failure, handle
});

// OR

dfd.then(function(){
    // ajax succes, handle
}, function(){
    // ajax failure, handle
});

一旦延迟对象得到“解决”(这发生在 ajax 调用完成或失败时),就会调用适当的回调。即使您在已解决回调时附加回调,您的回调也会立即触发(当然如果合适的话)

这是在 jQuery 中做事的新方式,它可以为您省去很多麻烦!它很干净,并且使处理异步性变得容易得多。

此处的文档中的更多信息

于 2012-09-22T08:27:40.410 回答