2012-11-17 7 views
6

私はサーバーにajax呼び出しを行っています。実行する必要があるコードは3つのグループに分けられます。 AJAX呼び出しが戻った後に実行する必要があります ajaxコールバックを待っている間にjavascriptを実行する方法

  • コード(サーバーに行くJSONオブジェクトを準備)製のAJAXコールインする前に実行する必要が

    1. コード(から返送されたものを使用していますサーバー)
    2. ユーザーがボタンを押してからすべてが完了するまでの間に実行する必要があるコード。このコードでは、返されたjsonオブジェクトは必要ありません。

    AJAX呼び出しを行った後、結果が最高のユーザーエクスペリエンスとパフォーマンスを得るために戻ってきた前に、グループ3のコードを実行するのに理想的です。

    これはできますか?

    どのようにですか?

  • +1

    あなたはドキュメントを読もうとしましたか? http://api.jquery.com/jQueryのすべてのケースについての説明があります。ajax/ – charlietfl

    答えて

    9

    function someFunction() { 
        //1. code that needs to run before ajax 
        $.ajax({...}).done(function() { 
         //2. code that needs to be run after the ajax call has returned 
        }); 
        //3. code that needs to be run between the time the user presses 
        // a button and the time everything is done. 
    } 
    

    JavaScriptが実行に同期しているので(労働者が使用されていない限り、それは、この特定の問題とは無関係なのです)これは動作します。最初のコードが実行されると、ajax呼び出しはブラウザにXHR要求を開始するように指示しますが、someFunctionは完了していないため、同期して実行され続けます。

    someFunctionが実行されると、発生する非同期イベントまでコントロールフローが開き、最終的にdoneコールバックにつながります。

    ほとんどの人にとって、公正で非同期のイベント指向プログラミングは頭を悩むものではありません。どのようなコードが何時に発生するはずかを追跡するのは簡単です。ここで

    は、非同期動作がどのように動作するかの簡単実行例を示します

    (function() { 
        alert(1); 
        setTimeout(function() { 
         alert(2); 
        }, 0); //note the 0ms delay 
        alert(3); 
    }()); 
    

    アラートの順序は132になります。 setTimeoutは、指定された時間が経過するのを待つことに依存するため、コールバックを同期的に呼び出さないため、時間が経過しなくても、現在の関数が終了するまで待つ必要があります。

    +0

    +1 - これは多くの開発者が問題を抱えていることです。 – dtbarne

    +0

    '// 3'は' // 2'の前に実行されることが本当に保証されていますか? '// 3'には、計算/完了に長い時間を要する多くの関数が含まれていますが、' // 2'は理論的に '// 3'の実行中の任意の時点で呼び出しスタックにジャンプできませんでしたか?私は非同期呼び出しを意味するものではなく、 '// 2 'はイベント駆動型であるため、実行中の任意の時点でイベントが発生する可能性があると考えています。 – Jan

    +0

    @Janでは、非同期イベントの「起動」は単に実行フロー*キュー*に関数呼び出しを追加することです。以前にキューに入れられた関数の実行が完全に終了すると、キューは次の関数呼び出しに移動します。ワーカーなどのマルチスレッドを明示的に使用しない限り、関数呼び出しを混在させることはできません。 – zzzzBov

    0

    クライアントイベントやその他のシナリオに反応するときにajax呼び出しを実行すると、コールバックにコードを指定できます。また、ajaxコードの直後に実行されるコード(コールバックではありません)も指定できます。

    例:作られるAJAX呼び出しが前に実行することが保証されて前に実行

    // Code before the ajax call is made 
    $.ajax({ 
        params, //other key values such as data 
        success: function (data) { 
         // one of the possible callbacks 
        } 
    }); 
    // Code executed immediately after ajax call is performed 
    // This is executed before or after the callback is complete 
    // In most cases it's before 
    

    だから、何でも。 ajax呼び出しの直後は、コールバックが呼び出される前に実行されることがほとんど保証されます。コールバックは、サーバーが応答を返した後に実行されることが保証されています。非常に単純

    +0

    "これはコールバックが完了する前または後に実行されます"、コールバックが完了する前に起こることはないので、私はdownvoteするつもりでしたが、オプションとして使用すると同期コールバックを持つことができました。コントロールフローが解放される前に非同期コールバックが発生する可能性があることを暗示しています。 – zzzzBov

    +0

    @zzzzBov非同期コードの後に​​非同期コードを設定することもできます。したがって、最初のコールバックの前に実行することは保証されていません。これが私の答えがそのような理由です。私の答えを改善できると思ったら編集してください:) –

    +0

    非同期コールバックが発生する前に非同期コードの呼び出し( 'setTimeout(fn、delay)'など)が実行されます。関数が実行された後、キューに入れられた関数は、呼び出された順に実行されます。例えば、 'success'コールバックがキャッシュされたデータを使用し、そのコールバックを直ちにキューに入れる可能性がありますが、現在実行中の関数が終了した後も*保証されます。 – zzzzBov

    関連する問題