61

以下は、Ngrx の例のコードswitchMapですmergeMap。それは、最初の @Effect がネットワークを処理しているためであり、switchMap実行中の場合は前のネットワーク リクエストをキャンセルできるためですか?

@Effect() search$ = this.updates$
    .whenAction(BookActions.SEARCH)
    .map<string>(toPayload)
    .filter(query => query !== '')
    .switchMap(query => this.googleBooks.searchBooks(query)
      .map(books => this.bookActions.searchComplete(books))
      .catch(() => Observable.of(this.bookActions.searchComplete([])))
    );


  @Effect() clearSearch$ = this.updates$
    .whenAction(BookActions.SEARCH)
    .map<string>(toPayload)
    .filter(query => query === '')
    .mapTo(this.bookActions.searchComplete([]));


  @Effect() addBookToCollection$ = this.updates$
    .whenAction(BookActions.ADD_TO_COLLECTION)
    .map<Book>(toPayload)
    .mergeMap(book => this.db.insert('books', [ book ])
      .mapTo(this.bookActions.addToCollectionSuccess(book))
      .catch(() => Observable.of(
        this.bookActions.addToCollectionFail(book)
      ))
    );


  @Effect() removeBookFromCollection$ = this.updates$
    .whenAction(BookActions.REMOVE_FROM_COLLECTION)
    .map<Book>(toPayload)
    .mergeMap(book => this.db.executeWrite('books', 'delete', [ book.id ])
      .mapTo(this.bookActions.removeFromCollectionSuccess(book))
      .catch(() => Observable.of(
        this.bookActions.removeFromCollectionFail(book)
      ))
    );
}
4

4 に答える 4

4

マージマップ

出力 Observable にマージされる Observable に各ソース値を射影します。

各値を Observable にマップし、mergeAll を使用してこれらの内部 Observable をすべてフラット化します。

ここに画像の説明を入力

スイッチマップ

各ソース値を出力 Observable にマージされる Observable に射影し、最も最近射影された Observable からのみ値を発行します。

各値を Observable にマップし、スイッチを使用してこれらの内部 Observable をすべてフラット化します。

ここに画像の説明を入力

出典: RxJS の ES6 オブザーバブル

于 2016-07-27T15:58:50.217 に答える