3

API に対して DELETE 呼び出しを行う一般的な機能があります。関数は次のようなものです。

deleteItem(url, item, action) {
    return this.http.delete(url)
        .subscribe(
            () => this.store.dispatch({ type: action, payload: item }),
            error => this.errorHandler(error),
            () => console.debug('Delete complete')
        )
    ;

さまざまな URL、アイテム、およびアクションを送信するいくつかの場所からこの関数を呼び出します。次のような関数があるとしましょう。

deleteBookcase(bookcase) {
    this.apiService.deleteItem(BOOKCASE_URL, bookcase, BOOKCASE_REMOVE);
}

アイテムが API から削除されたら、別のアクションをトリガーしたい場合があります。たとえば、本棚を削除したので、私のグローバル ストアの本が変更されたかどうかを確認したい場合があります。

deleteBookcase追加のアクションを時期尚早にトリガーする前に、HTTP 呼び出しと後続のアクションが完了したことを関数に知らせる簡単な方法はありますか?

4

2 に答える 2

3

map()の代わりsubscribe()に使用deleteItem()

deleteItem(url, item, action) {
    return this.http.delete(url)
        .map(() => this.store.dispatch({ type: action, payload: item })
        .catch((error) => this.errorHandler(error))
        .do(() => console.debug('Delete complete'))
 });
}

どこに電話しても購読できますdeleteItem()

deleteBookcase(bookcase) {
    this.apiService.deleteItem(BOOKCASE_URL, bookcase, BOOKCASE_REMOVE)
    .subscribe(data => doSomething());
}

do、、をインポートすることを忘れないでmapくださいcatch

于 2016-06-28T12:08:37.870 に答える
3

これを行うには、次のようにメソッドをリファクタリングします。

deleteItem(url, item, action) {
  return this.http.delete(url)
      .catch((error) => {
        // handle error
      })
      .do(() => {
        this.store.dispatch({ type: action, payload: item });
      });
}

deleteBookcase(bookcase) {
    this.apiService.deleteItem(BOOKCASE_URL, bookcase, BOOKCASE_REMOVE).subscribe(() => {
      // do something
    });
}

doアクションが非同期データ フローの外部で実行される場合は、演算子を使用します。呼び出しが終了した後に通知dispatchする (そしてオブザーバブルを返す) 場合は、次のflatMapものを使用できます。

deleteItem(url, item, action) {
  return this.http.delete(url)
      .catch((error) => {
        // handle error
      })
      .flatMap(() => {
        return this.store.dispatch({ type: action, payload: item });
      });
}

このようにメソッドをリファクタリングすることにより、オブザーバブルは遅延しているため、deleteItemサブスクライブせずに呼び出すとリクエストが実行されないため、注意が必要です。

// Request isn't executed
this.deleteItem();

// Request is executed
this.deleteItem().subscribe(() => {
});
于 2016-06-28T12:09:15.767 に答える