在同步调用之前先调用函数



我有一个简单的问题(但答案似乎并不简单)。

我的代码中有一个同步AJAX调用,我想在这个同步调用之前调用一个函数。

我想调用的函数只是

$.blockUI();

来自jQuery BlockUI插件。

我只是试着把这一行放在$.ajax调用之前,但blockUI似乎是在同步调用之后调用的。

然后我尝试使用$.ajax的beforeSend选项,和上面的问题相同。

提前感谢你能带来的任何答案(除了使用异步呼叫,这在我的情况下是不可能的…)

此处提供代码:http://jsfiddle.net/vWsus/2/

同步调用很糟糕,它们会锁定浏览器,如果不返回调用,则用户体验不佳。问题是同步调用锁定了浏览器,因此DOM永远没有时间重新绘制。您需要给DOM更新时间,所以在进行Ajax调用之前设置一个超时。

$.blockUI({ message: '<p>foo</p>' });
window.setTimeout( ajxCallFnc, 100);

在您的情况下,并不是在同步调用之后调用blockUI,只是同步请求阻止了显示回流(这通常比实际的DOM操作"有时晚"发生)。正如你所说,当你尝试;在调用ajax之前调用blockUI,而不是从beforeSend回调内部调用,最终会得到几乎相同的结果。

jQuery中无法阻止这种行为,因为它不是jQuery错误(也不是浏览器本身,因为同步xhr请求无论如何都应该冻结浏览器,并且没有任何内容表明浏览器必须在这种情况下继续回流)。

我所能建议的就是永远不要使用同步请求。异步的很容易处理。

您可以看看为什么应该异步使用XMLHttpRequest

$.blockUI有一个onBlock函数。试试这样的东西:

$.blockUI({ 
    message: '<img id="processing" src="images/loading.gif" />', 
    onBlock: function() {
        // make your sync call here
        $.ajax({
            type: 'POST',
            cache: false,
            async: false,               
            url: blahblah,
            dataType: 'json'                
        }).done(function(data){
            //process response
        });
    }
}); 
this.notifyFixed=function(type,msg,callback){
        this.showNotification(type, msg);
            window.setTimeout(function(){
                if(typeof callback ==="function"){
                    callback();
                }
            },100);
    };

我有一个notifyFixed函数,我想在进行ajax调用之前做它,但遇到了同样的问题,所以我添加了超时和一个类似于epascarello的回调函数,似乎对我来说很好。

因此,希望类似的解决方案可以帮助其他人

相关内容

  • 没有找到相关文章

最新更新