24

私はいくつかの Web サイトを開発しましたが、常に同じ点でつまずきます: 複数の ajax 呼び出しです。すべてのコンテンツが非同期に読み込まれるメイン ページがあります。ページが読み込まれると、領域 (上、左、右、下) ごとにページを「描画」する 4 つの INDEPENDENT 呼び出しがあり、読み込み中に典型的な ajax スピンをユーザーに表示します。そのため、ブラウザーがリクエストを受信すると、コールバックを実行し、さまざまな領域がさまざまな時間に描画されます。実はサーバー側の答えが混同していることがあります。

各リクエストにタイムスタンプを作成して、各リクエストが異なることをブラウザとサーバーに示すなど、いくつかのソリューションを試しました。

また、場合によっては、サーバーのキャッシュのいくつかのパラメーターを構成しようとしました。

機能する唯一の方法は、リクエストのコールバックに request2 を含めることなどです。

誰かがそれを行う適切な方法を知っているか、この問題を打ち負かしたことがありますか?? チェーンリクエストをしたくありません。

ありがとう

これが私が意味することの例です:

$(document).ready(function() {

$.get('/activity',Common.genSafeId(),function(data){$('#stream').html(data);$("#load_activity").addClass("empty");});
$.get('/messages',Common.genSafeId(),function(data){$('#message').html(data);$("#load_messages").addClass("empty");});
$.get('/deals',Common.genSafeId(),function(data){$('#new_deals_container').html(data);$("#load_deal").addClass("empty");});
$.get('/tasks',Common.genSafeId(),function(data){$('#task_frames').html(data);$("#load_task").addClass("empty");});});

そして、html は、それぞれ異なる ID を持つ 4 つのコンテナーを持つ単純な jsp です。

4

2 に答える 2

41

閉鎖

閉鎖は、最初は少し気が遠くなるようなものです。それらは、javaScript および他のいくつかの最新のコンピューティング言語の機能です。

クロージャは、1 つ以上の外部変数 (つまり、外部関数内にあるが内部関数の外部にある変数) へのアクセスを必要とする内部関数 (通常は匿名イベント ハンドラーまたは名前付きメソッド) を持つ関数の実行されたインスタンスによって形成されます。 )。驚くべきことは、内部関数の実行時に外部関数が完了して戻ってきたとしても、内部関数は外部変数へのアクセスを保持することです!

さらに、クロージャーによってトラップされた変数は、内部関数からのみアクセスでき、クロージャーを作成した外部環境からはアクセスできません。この機能により、たとえば、言語キーワード "Public" と "Private" がなくても、private メンバーと public メンバーを持つクラスのような構造を作成できます。

クロージャーは、内部関数が外部変数を使用して javaScript の「ガベージ コレクション」を抑制することによって可能になります。そうしないと、完了後の不確定な時点で外部関数の環境が破壊される可能性があります。

適切できちんとした JavaScript プログラミングに対するクロージャの重要性は、いくら強調してもしすぎることはありません。

関数フォームの下のコードではgetData()、呼び出しごとに、クロージャ トラップid1およびid2(およびurl) が匿名 ajax 応答ハンドラ ($.get の 3 番目の引数) で引き続き使用可能です。

$(document).ready(function() {

    function getData(url, id1, id2) {
        $.get(url, Common.genSafeId(), function(data) {
            $(id1).html(data);
            $(id2).addClass("empty");
        });
    }

    getData('/activity', '#stream', '#load_activity');
    getData('/messages', '#message', '#load_messages');
    getData('/deals', '#new_deals_container', '#load_deal');
    getData('/tasks', '#task_frames', '#load_task');

});

したがって、4 つの別個のハンドラーを作成するのではなく、クロージャーを形成して同じ関数getData()を 4 回呼び出す言語の機能を利用します。呼び出しごとに、getData()$.get の応答ハンドラー (サーバーが応答するときに非同期に呼び出される) がそのDOM 要素に対処できるようにする新しいクロージャーを形成します。

于 2012-04-14T07:59:57.567 に答える
-5

ajax呼び出しごとに異なるコールバックがあることを確認してください。4つすべてに同じ関数を使用しようとしているように聞こえます。したがって、それらが順不同で呼び出されると(サーバー側で時間がかかるため)、レンダリングされます。間違った場所に。すべてのコールバックに同じ関数を使用することを主張する場合は、コールバックがどこにレンダリングするかを認識できるように、ペイロードに何かを入れる必要があります。

于 2012-04-14T01:13:18.857 に答える