Determine if $.ajax error is a timeout

2018-12-31 16:41发布

问题:

I\'m utilizing the magic of jQuery.ajax( settings ).

However, I\'m wondering if anyone has played with the timeout setting much?

I know it\'s basically for dictating the local time for a request, but can it trigger anything if the timeout is reached? Or does it simply stop listening for a response?

Reading the jQuery site, I can see there are no arguments passed, so it seems like a simple setting with one capability. Which is fine.

But, I\'d like to trigger an alert or some function if the timeout is reached. I can see that the error setting doesn\'t get triggered, in this case.

Here\'s my snippet:

$(\"form#testform\").submit(function(){ 

 var allFormValues = $(\"form#testform\").serialize(); 

   $.ajax({
    cache:false,
    timeout:8000,  // I chose 8 secs for kicks
    type:\"POST\",
    url:\"someurl.php\",
    data:allFormValues,
    error:function(){ alert(\"some error occurred\") },
    success:function(response){ alert(response); }
   });

});

Does anyone know how to work more with timeout?

回答1:

If your error event handler takes the three arguments (xmlhttprequest, textstatus, and message) when a timeout happens, the status arg will be \'timeout\'.

Per the jQuery documentation:

Possible values for the second argument (besides null) are \"timeout\", \"error\", \"notmodified\" and \"parsererror\".

You can handle your error accordingly then.

I created this fiddle that demonstrates this.

$.ajax({
    url: \"/ajax_json_echo/\",
    type: \"GET\",
    dataType: \"json\",
    timeout: 1000,
    success: function(response) { alert(response); },
    error: function(xmlhttprequest, textstatus, message) {
        if(textstatus===\"timeout\") {
            alert(\"got timeout\");
        } else {
            alert(textstatus);
        }
    }
});​

With jsFiddle, you can test ajax calls -- it will wait 2 seconds before responding. I put the timeout setting at 1 second, so it should error out and pass back a textstatus of \'timeout\' to the error handler.

Hope this helps!