4

promises パターンと同様に、addEventListener/etc メソッドでオブジェクトを汚染する必要を回避するイベント パターンを探しています。オブジェクトを返すことができるようにしたいと考えています。このオブジェクトは、複数回「解決」するだけでなく、キャンセルすることもできます。

たとえば、次のような「間隔」オブジェクトを返すメソッドを作成する場合があります。

var ticker = createTicker(1000);
var subscription = ticker.then(function() { console.log('tick') });
... later on ...
subscription.cancel();

ここでの主な違いは、promise と同様にイベントが標準化されているため、イベント名を知らなくてもサブスクライブできますが、promise とは異なり、「完了」は複数回発生する可能性があり、キャンセルされることもあります (これはremoveEventListener と同等です)。

プログレスハンドラーを複数のコールバックに使用でき、完全なハンドラーが使用されないなど、これがプロミスで合法であるかどうかを確認することに興味がありますが、さらに重要なのは、プロミスからのサブスクライブを解除するという概念があることです。

これが当てはまらず、約束がこのシナリオに特化している場合、私が説明したことを行うための標準化されたパターンはありますか?

4

1 に答える 1

2

キャンセルする機能は、シングルファイアの成功/失敗のコールバックを持つという主要なパラダイムを破ることなく、promiseの実装に追加できます。

実際、jQueryには、jQuery.ajax呼び出しから返されるpromiseインスタンスのキャンセルがすでにあります。

XMLHttpRequestとの下位互換性のために、jqXHRオブジェクトは次のプロパティとメソッドを公開します。

  • readyState
  • 状態
  • statusText
  • 基になるリクエストがそれぞれxmlおよび/またはtextで応答した場合のresponseXMLおよび/またはresponseText
  • setRequestHeader(name、value)は、新しい値を古い値に連結するのではなく、古い値を新しい値に置き換えることによって標準から逸脱します。
  • getAllResponseHeaders()
  • getResponseHeader()
  • アボート()

setTimeout追加のcancelメソッドとともにpromiseインターフェースを公開するラッパーを作成できます。

しかし、一度マルチファイアの領域に入ると、それは約束が意図されているものではないと思います。通常のpromise機能と一緒に複数の発砲がどのように実行されるかについて、多くのルールと例外を定義する必要があります。そのようにpromiseを使用することは私にはあまり意味がありません。


更新(コメントでの議論に基づく):

次に、done/failコールバックのさらなるリレーを中止できるpromise「プロキシ」の実装例を示します。

http://jsfiddle.net/atesgoral/qvtqu/

于 2011-09-28T20:25:11.963 に答える