web-dev-qa-db-ja.com

Rx.Observable subscribeとforEachの違いは何ですか

そのようにObservableを作成した後

var source = Rx.Observable.create(function(observer) {...});

subscribeの違いは何ですか

source.subscribe(function(x) {});

およびforEach

source.forEach(function(x) {});
46

ES7仕様 で、これは RxJS 5. に続きます(ただし、RxJS 4.0にはありません)、2つは同じではありません。

subscribe

public subscribe(observerOrNext: Observer | Function, error: Function, complete: Function): Subscription

Observable.subscribeは、実際のObservable処理のほとんどを行う場所です。サブスクリプショントークンを返します。これを使用して、サブスクリプションをキャンセルできます。これは、サブスクライブしたイベント/シーケンスの期間がわからない場合、または既知の期間より前にリスニングを停止する必要がある場合に重要です。

forEach

public forEach(next: Function, PromiseCtor?: PromiseConstructor): Promise

Observable.forEachは、Observableが完了またはエラーになったときに解決または拒否するプロミスを返します。約束を処理することにより、すべての着信値を照合してから一度提示するなど、より「同期」的な方法で、有界/有限期間の観測可能なシーケンスを処理する状況を明確にすることを目的としています。

事実上、各値に加えて、エラーおよび完了イベントのどちらでも実行できます。したがって、最も重要な機能上の違いは、約束をキャンセルできないことです。

59
shannon

技術的にはforeachのコードが実際にRxScala、RxJS、およびRxJavaでサブスクライブを呼び出しています。大きな違いはないようです。これらは、ユーザーがサブスクリプションなどを停止する方法を持つことができる戻り値の型を持っています。

以前のバージョンのRxJavaで作業しているとき、サブスクライブにはサブスクリプションリターンがあり、forEachは単なる無効です。変更により、異なる回答が表示される場合があります。

/**
 * Subscribes to the [[Observable]] and receives notifications for each element.
 *
 * Alias to `subscribe(T => Unit)`.
 *
 * $noDefaultScheduler
 *  
 * @param onNext function to execute for each item.
 * @throws Java.lang.IllegalArgumentException if `onNext` is null
 * @throws rx.exceptions.OnErrorNotImplementedException if the [[Observable]] tries to call `onError`
 * @since 0.19
 * @see <a href="http://reactivex.io/documentation/operators/subscribe.html">ReactiveX operators documentation: Subscribe</a>
 */
def foreach(onNext: T => Unit): Unit = {
    asJavaObservable.subscribe(onNext)
 }

def subscribe(onNext: T => Unit): Subscription = {
    asJavaObservable.subscribe(scalaFunction1ProducingUnitToAction1(onNext))
}

/**
 *  Subscribes an o to the observable sequence.
 *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.
 *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.
 *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.
 *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.
 */
observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {
  return this._subscribe(typeof oOrOnNext === 'object' ?
    oOrOnNext :
    observerCreate(oOrOnNext, onError, onCompleted));
};

/**
 * Subscribes to the {@link Observable} and receives notifications for each element.
 * <p>
 * Alias to {@link #subscribe(Action1)}
 * <dl>
 *  <dt><b>Scheduler:</b></dt>
 *  <dd>{@code forEach} does not operate by default on a particular {@link Scheduler}.</dd>
 * </dl>
 * 
 * @param onNext
 *            {@link Action1} to execute for each item.
 * @throws IllegalArgumentException
 *             if {@code onNext} is null
 * @throws OnErrorNotImplementedException
 *             if the Observable calls {@code onError}
 * @see <a href="http://reactivex.io/documentation/operators/subscribe.html">ReactiveX operators documentation: Subscribe</a>
 */
public final void forEach(final Action1<? super T> onNext) {
    subscribe(onNext);
}

public final Disposable forEach(Consumer<? super T> onNext) {
    return subscribe(onNext);
}