use*_*179 27 javascript jquery jquery-blockui
我有一个简单的ajax调用,它在beforeSend和on complete上执行一个函数.它们执行得很好但是beforeSend"看似"在成功之后才会被执行.在发送之前有一个"请稍候"通知.如果我在beforeSend中的函数之后放了一个休息,那么它将显示该通知然后点击成功.没有断点,那么它将坐在那里等待响应时思考,然后我的请等待通知将在成功命中后出现几分之一秒.所需的功能是在请求发送后立即显示通知,以便在等待响应时显示.
$.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();
}
});
Run Code Online (Sandbox Code Playgroud)
Ste*_*eve 26
你的问题是async:false
旗帜.除了它是不好的做法(实际上只在非常有限的情况下才有意义),它实际上与其余代码的执行顺序混淆.原因如下:
它似乎在blockUI
代码中的某个地方设置了一个setTimeout
.结果,blockUI
代码等待的时间非常短.由于队列中的下一条指令是ajax()
调用,因此blockUI
执行位于其后面.而且由于您正在使用async:false
,它必须等到完成ajax
调用完成才能运行.
详细而言,这是发生的事情:
blockUI
blockUI
有一个setTimeout并在超时完成后执行(即使超时长度为0,下一行将ajax()
首先运行)ajax()
调用with async:false
,这意味着JS会停止所有内容,直到请求返回ajax()
成功返回,JS执行可以继续blockUI
代码中的setTimeout 可能已经结束,因此将在下一步执行blockUI
一部分运行success
,但实际上,由于超时,它刚刚排队如果你不使用async:false
,执行将如下:
blockUI
blockUI
有一个setTimeout并在超时完成后执行(即使超时长度为0,下一行将ajax()
首先运行)ajax()
被调用并向服务器发送请求.blockUI
代码中的setTimeout 可能已经结束,因此将在下一步执行blockUI
文本显示出来success
和complete
回调以下是一些用于演示此问题的jsFiddle示例:
示例1:这是您遇到的情况.该blockUI
文本不显示,直到后ajax
调用执行.
示例2:这与您的情况完全相同,但alert
在ajax
通话之前.因为有一个alert
,内部超时blockUI
将blockUI
文本的外观放在后面alert
而不是之后ajax
.
示例3:这就是它应该如何工作async:false
这很可能是因为async : false
.由于你的调用是同步的,在你调用$.ajax()
函数开始之后,没有任何事情发生,直到收到响应,然后你的代码下一件事就是success
处理程序
为了使它工作,你可以做这样的事情
$.blockUI({
fadeIn : 0,
fadeOut : 0,
showOverlay : false
});
// and here goes your synchronous ajax call
$.ajax({
type : 'POST',
url : url,
async : false,
data : postData,
success : function (returnData) {
//stuff
},
error : function (xhr, textStatus, errorThrown) {
//other stuff
},
complete : function (){
$.unblockUI();
}
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
63505 次 |
最近记录: |