3

私の jQuery Web アプリでは、ほとんどイベントを使用しています。
サーバーへの ajax クライアント要求 (名前は「comm」) を実行するためのコンポーネントには、キューがあります。
このキューは Backbone.js コレクションに似ています。

そのため、新しいリクエスト オブジェクトを「comm」のコレクションに入れるたびに、現在進行中のリクエストがある場合、comm オブジェクトは「add」イベントを取得し、「comm」の「worker」メソッドが見えます。誰もいない場合、ワーカー メソッドはリクエストを処理し、最終的にすべてが正常に機能すると、リクエスト オブジェクトで「完了」イベントをトリガーします。

この通信コンポーネントでは、一度に 1 つの要求のみが可能です。リクエスト オブジェクトを「comm」に追加し、「add」イベントがトリガーされ、ワー​​カー メソッドがすでにリクエストがあることを確認すると、何も起こりません。

私の質問は次のとおりです。この状況では、「イベントインフラストラクチャ」に関して、この未処理のリクエストオブジェクトを処理するための最良のアプローチは何ですか?

今まで私は2つの異なるアプローチをとっていました:

1) 次のことができます: 進行中のリクエストが終了した場合、ワーカー メソッドはコレクション内に未処理のリクエスト オブジェクトがあるかどうかを確認し、それを処理できます。これは単純で、イベントは関与しません。

2) または別の方法: 「追加」イベントが原因でワーカー メソッドが開始され、進行中の要求が既に存在することがわかった場合、次のようなものを実装できます。「この追加イベントに適切に応答できません。戻します。 . 200 ミリ秒後に再度トリガーしてください。その時間があるかもしれません。」

誰かがすでに同様の問題を抱えていて、これに対する非常に優れた解決策を持っているのではないでしょうか?

4

2 に答える 2

2

この問題への良いアプローチは、キューで発生する「次の」イベントを実装することだと思います。「完了」イベントがトリガーされるたびに、キューで次のイベントが発生し、未処理のリクエストがあるかどうかが確認され、未処理のリクエストがある場合は、ロジックに従って 1 つが選択されます (FIFO を想定しています)。

于 2013-02-07T10:56:51.757 に答える
0

リクエストやその他の非同期イベントをチェーンしたいですか? その場合、promiseパターンはエレガントなソリューションです。

JQuery はすでにDeferred オブジェクトでそれを実装しています。

JQuery 1.8+ を使用すると、リクエスト チェーンは次のように単純になります。

$.ajax(...).then(
    function() {
        return $.ajax(...);
    }
).then(
    function() {
        return $.ajax(...);
    }
);

しかし、それを中心に、より動的で複雑なアーキテクチャを構築することもできます。たとえば、キュ​​ーがすでにアクティブなときに新しいハンドラーをアタッチできるように、常に最後の未解決の promise を格納するようにキューを実装できます。

一般的な例:

var Queue = function() {
    // start with resolved promise
    var promise = $.Deferred().resolve();

    this.add = function(handler) {
        // chain and replace latest with next promise
        promise = promise.then(function() {
            var deferred = $.Deferred();
            handler(deferred);
            return deferred;
        }).promise();
    }
};

var q = new Queue();
q.add(function(deferred) {
    setTimeout(function() { alert('handler 1'); deferred.resolve(); }, 1000);
});
q.add(function(deferred) {
    setTimeout(function() { alert('handler 2'); deferred.resolve(); }, 1000);
});

JSFiddle デモ

ここで、ハンドラーは遅延オブジェクトをパラメーターとして取得し、「完了」した場合にそれを解決 (または拒否) する責任があります。別のより柔軟な可能性は、ハンドラーが遅延オブジェクトを自分で作成し、その約束を返す必要があることです。このようにして、 $.ajax によって返されるような他の約束を使用することもできます

于 2013-02-07T10:34:02.633 に答える