2

私は 3 つの非同期アクション (オブザーバブル) を実行しようとしています。1. 最初のオブザーバブルは、モーダル ダイアログ eventEmiter の応答です。残りのフローは、その応答に依存します (「項目を削除しますか」に関するモーダル リターン ブーリアン エミッターとしましょう)。2. 2 番目のオブザーバブルは、更新 (削除) アクションです。 3. 3 番目は、削除後に新しいデータを取得しています。

私は rxjs- を使用しており、サブスクライブでサブスクライブせずにそれを行う方法を見つけようとしています。私のコードを見てください:

subscriptions : Subscription[] = [];

openDeleteDialog(data : any)
{
    const modalRef : NgbModalRef = this.modalService.open(ConfirmationDialogComponent); //Modal  dialoge reference
    this.subscriptions.push(modalRef.componentInstance.passResult.subscribe( 
    (result =>//This is the response from the modal dialog
      {
        if (result)
        {
          let updateApi : UpdateApi = new UpdateApi(data);
          this.srv.updateData(updateApi).pipe( //This is the update operation
            tap(() =>
            { 
              this.srv.getData(); //This is the fetch data operation
            }
            )

          ).subscribe();
        }
      }
    )
    ));
} 
4

3 に答える 3

3

そのためにパイプ、フィルター、およびスイッチマップを使用できます。

subscriptions : Subscription[] = [];

openDeleteDialog(data : any)
{
  const modalRef : NgbModalRef = this.modalService.open(ConfirmationDialogComponent); //Modal  dialoge reference
  this.subscriptions.push(
    modalRef.componentInstance.passResult
     .pipe(
       filter((result) => !!result),
       switchMap((result) => {
          let updateApi : UpdateApi = new UpdateApi(data);
          return this.srv.updateData(updateApi);
       }),
       switchMap((updateResult) => this.srv.getData())
     ).subscribe((getDataResult) => console.log(getDataResult))
  );
}

最初にフィルターを使用して、結果が何かの場合にのみデータを渡します。次に、新しいオブザーバブルである更新データ オブザーバブルに切り替え、同時にそれをパイプして取得データ オブザーバブルに切り替えます。そうすれば、オブザーバブルを連鎖させることができます。更新データの結果が再びデータを取得するのを待つ必要があると思います。

編集:追加の情報、あなたは tap to call を使用していましthis.srv.getData()たが、それが http 要求でオブザーバブルを返す場合、要求を行うにはそれにサブスクライブする必要があるため、その要求は呼び出されません。原則として、私は観測可能な結果のみを必要とする副次的効果のためにタップ パイプを使用します。

于 2019-10-27T09:38:55.640 に答える