Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在同步调用之前调用函数_Javascript_Jquery_Ajax_Jquery Plugins_Blockui - Fatal编程技术网

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

Javascript 在同步调用之前调用函数,javascript,jquery,ajax,jquery-plugins,blockui,Javascript,Jquery,Ajax,Jquery Plugins,Blockui,我有一个简单的问题(但答案似乎并不简单) 我的代码中有一个同步AJAX调用,我想在这个同步调用之前调用一个函数 我想调用的函数很简单 $.blockUI(); 来自jQuery BlockUI插件 我只是试着把这一行放在$.ajax调用之前,但blockUI似乎是在同步调用之后调用的 然后,我尝试使用$.ajax的beforeSend选项,与上面的问题相同 提前感谢您提供的任何答案(除了使用异步调用,这在我的情况下是不可能的…) 这里有代码:同步调用不好,它们会锁定浏览器,如果调用未返回,则用

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

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

我想调用的函数很简单

$.blockUI();
来自jQuery BlockUI插件

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

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

提前感谢您提供的任何答案(除了使用异步调用,这在我的情况下是不可能的…)


这里有代码:

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

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

'}); 设置超时(ajxCallFnc,100);
在您的情况下,并不是在同步调用之后调用blockUI,而是同步请求阻止了显示回流(这通常发生在实际的DOM操作之后)。正如您所说的,当您尝试在调用ajax之前调用blockUI,而不是从beforeSend回调内部调用blockUI时,您得到的结果基本相同

在jQuery中无法阻止这种行为,因为它不是一个jQuery bug(也不是浏览器bug本身,因为同步xhr请求无论如何都应该冻结浏览器,并且没有任何东西说浏览器必须在该实例中进行回流)

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


您可以查看

$。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

        });
    }
}); 
$.blockUI({
消息:“”,
onBlock:function(){
//在这里进行同步呼叫
$.ajax({
键入:“POST”,
cache:false,
async:false,
网址:blahblah,
数据类型:“json”
}).完成(功能(数据){
//过程响应
});
}
}); 
在调用ajax之前,我有一个notifyFixed函数,但遇到了同样的问题,所以我添加了timeout和一个类似于epascarello的回调函数,这对我来说似乎很好


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

您可以在这里发布代码或制作JSFIDLE吗?您是否尝试过使用:$(document).ajaxStart($.blockUI).ajaxStop($.unbui);如果您正在计算机上测试代码,那么ajax调用可能比fadein更快。您可以尝试将fadein设置为0。顺便说一下,包括阻止用户交互在内的同步ajax行为往往会产生糟糕的用户界面体验。“像走投无路的老鼠一样友好。”查看UI设计模式和书籍,包括“不要让我思考”,为您的用户提供更好的体验…@rsp事实上,我不使用blockUI来“阻止”UI,而是将其用作加载消息。实际上,我正在创建一个设计应用程序,其中用户将项目拖放到拖放区域,当项目被拖放时,有一个繁重的过程,这就是为什么我希望显示一条消息,说明它正在进行。我尝试在可拖放项的drop事件的第一行中“阻止”UI,但它不起作用,blockUI在再次调用后显示…我知道同步调用不好,但我需要使用它,否则我会丢失一些数据,因此在ajax调用上设置超时不是一个选项。相信我,我很想使用异步调用,但这次我不能…@user1374021解决方案仍然有效,只需给blockui代码一段时间运行即可。在进行实际的Ajax调用之前增加一点延迟。@user1374021:epascarello的解决方案是进行同步调用,而不是异步调用。不过,您能否回答为什么您说您不能使用异步调用,为什么您认为这样做会丢失一些数据?有可能您弄错了,事实上您可以使用异步调用,这将大大简化您的问题。否则,如果您实际上不能使用异步调用,那么我很想知道您的用例,因为我还没有见过这样的用例。如果你愿意回答我的问题,我或你肯定会学到一些东西。谢谢。此时,在调用onBlock()时,您的代码是异步执行的,这意味着您可以将ajax调用设为异步,因为$.blockUI()调用之后的所有内容都将在响应之前执行。
this.notifyFixed=function(type,msg,callback){
        this.showNotification(type, msg);
            window.setTimeout(function(){
                if(typeof callback ==="function"){
                    callback();
                }
            },100);
    };