0

サーバーからの部分的なビューが読み込まれた ajax である jquery ui ダイアログがあります。ダイアログは最初に dialog-ajax-loader として開き、呼び出しが戻ると、コンテンツのサイズに合わせてアニメーション化/拡大します。

問題は、ダイアログのコンテンツがキャッシュされるか、ajax 呼び出しが速すぎる場合です。Ajax ローダーが実際に一瞬でも表示されることなく、コンテンツが基本的にすぐに ajax ローダー サイズのダイアログに読み込まれるという望ましくない効果が得られます。 . 言うまでもなく、これを素晴らしいものにするために私が費やしたすべての作業を考えると、これで満足することはできません. ajax ローダーが最低 1 秒表示する必要があります。実際に ajax 呼び出しにもっと時間がかかる場合は、それ以上表示する必要があります。

素敵な sleep() 関数を見つけようとかなり長い間 Web を検索してきましたが、常にタブーがあります。ここに投稿して、これを行うための最良の方法についていくつかのアイデアを得たいと思いました。

もちろん、実際のコードはもっと複雑ですが、概念的には次のようになります。

 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

リクエストを発行する前にフラグを追加し、同時に1000ミリ秒のsetTimeoutを試して、コールバックでフラグをクリアしてください

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 に答える