1

スクリプトにいくつかのajaxリクエストがあり、いくつかは同期します。いくつかは非同期です。apload.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 の新しい Deferred システムを使用して、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.thendeferred.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 に答える