0

我有一个 jquery ui 对话框,它加载了来自服务器的部分视图的 ajax。该对话框最初以 dialog-ajax-loader 的形式打开,当调用返回时,它会动画/增长到内容的大小。

问题是当对话框内容被缓存或 ajax 调用太快时,我会得到一个不受欢迎的效果,即内容基本上立即加载到 ajax-loader 大小的对话框中,而 ajax 加载器实际上是不可见的,即使是片刻. 不用说,我付出了所有努力让这看起来很棒,我不能满足于此。我需要 ajax 加载器至少显示 1 秒,如果 ajax 调用实际上需要更多时间,则需要更多时间。

我已经在网上搜索了很长时间,试图找到一个不错的 sleep() 函数,但总是有一个禁忌。想在这里发帖以获得一些想法,这是最好的方法。

实际的代码当然要复杂得多,但在概念上是这样的:

 var mydialog = $("<div></div>").dialog({...Ajax loader settings...});

 var minimumTimeMet = false;
 setTimeout(function( ){ minimumTimeMet = true; }, 1000);
 mydialog.dialog("open"); //Open ajax loader

 $.ajax({ 
     cache: false,   //This helps but not always, sometimes the request is just too fast
     ....
     success: function(htmlContentResponse){

          while(!minimumTimeMet){
              //sleep here! However, thread cannot be 
              //blocked because the function set in setTimeout
              //above must executed to change minimumTimeMet = true 
              //and break out of this loop. 
          }

          mydialog.html(htmlContentResponse);  
          mydialog.animate({...Animate into new dialog settings ...});
     }

 });
4

1 回答 1

2

尝试在触发请求之前添加一个标志,同时 setTimeout 为 1000ms 并在回调中清除标志

var flag = false;
var response;

setTimeout(function () {
    flag = true;
    if (response) {
        ajaxCallback(response);
    }
}, 1000);

$.ajax({
    cache: false,
    success: function(htmlContentResponse){
        response = htmlContentResponse;
        if (flag)   {
            ajaxCallback(response);
        }
    }
});

function ajaxCallback(htmlContentResponse) {
    // Do something
}

这样,如果 ajax 调用提前结束,它会等到 setTimeout 回调被执行。

于 2013-01-25T04:29:32.660 回答