I have a simple ajax call that is executing a function on the beforeSend and on complete. They execute fine but the beforeSend is "seemingly" not executed until after the success. On the before send there is a "Please wait" notification. If I put a break after the function in the beforeSend then it will show that notification and then hit the success. Without the break point then it will sit there and think while waiting for the response and then my please wait notification will appear for a fraction of a second after the success is hit. The desired functionality is to have the notification appear as soon as the request is sent so it displays while it is waiting for the response.
$.ajax({
type : 'POST',
url : url,
async : false,
data : postData,
beforeSend : function (){
$.blockUI({
fadeIn : 0,
fadeOut : 0,
showOverlay : false
});
},
success : function (returnData) {
//stuff
},
error : function (xhr, textStatus, errorThrown) {
//other stuff
},
complete : function (){
$.unblockUI();
}
});
Your problem is the
async:false
flag. Besides the fact that it is bad practice (and really only makes sense in a very limited number of cases), it actually messes with the order of execution of the rest of the code. Here is why:It seems that somewhere in the
blockUI
code they are setting asetTimeout
. As a result, theblockUI
code waits a very short amount of time. Since the next instruction in the queue is theajax()
call, theblockUI
execution gets placed right behind that. And since you are usingasync:false
, it has to wait until the completeajax
call is completed before it can be run.In detail, here is what happens:
blockUI
blockUI
has a setTimeout and gets executed after the timeout is done (even if the timeout length is 0, the next line,ajax()
will be run first)ajax()
is called withasync:false
, which means JS stops everything until the request returnsajax()
returns successfully and JS execution can continueblockUI
code is probably over, so it will be executed nextblockUI
runs as part ofsuccess
, but in reality, it has just been queued up because of a timeoutIf you would NOT use
async:false
, the execution would go as followed:blockUI
blockUI
has a setTimeout and gets executed after the timeout is done (even if the timeout length is 0, the next line,ajax()
will be run first)ajax()
is called and sends of a request to the server.blockUI
code is probably over, so it will be executed nextblockUI
text shows upsuccess
andcomplete
callbacks are executedHere are some jsFiddle examples to demonstrate the problem:
Example 1: This is the situation you are experiencing. The
blockUI
text doesn't show until after theajax
call executes.Example 2: This is the exact same situation as yours, but with an
alert
before theajax
call. Because there is analert
, the timeout insideblockUI
places the appearance of theblockUI
text after thealert
instead of after theajax
.Example 3: This is how it is supposed to work without
async:false
http://bugs.jquery.com/ticket/7464
Another approach could be overload $.ajax function
not perfect (because of different deferred object), but may be helpful..
This is most probably because of
async : false
. As your call is synchronous, after your call to the$.ajax()
function begins, nothing happens until the response is received, and the next thing as far as your code goes will be thesuccess
handlerTo make it work, You can do something like this