簡體   English   中英

從效果中調度多個動作:不同rxjs運算符之間的差異

[英]Dispatch multiple actions from effects: difference between different rxjs operators

一旦http請求成功,我需要從ngrx效果中分派多個動作。

有幾種方法似乎有效,有些方法沒有,我無法理解有什么區別。

@Effect()
    loadUser = this.actions
        .pipe(
            ofType(campaignActions.type.LOAD_CAMPAIGN),
            map((action: userActions.LoadUserAction) => action.payload),
            switchMap((payload: { id: number }) =>
                this.s.getUser(payload.id)
                    .pipe(
                        switchMap((data) => {

                            return from([
                                new userActions.LoadUserSuccessAction(),
                                new userActions.SomethingElseSuccessAction()
                            ]);
                        }),
                        catchError(() => of(new userActions.LoadUserFailureAction()))
                    )
            )
        );

首先,我可以使用switchMap或mergeMap。 我認為不同之處在於,如果多次觸發此效果,如果我使用switchMap,則會取消任何正在進行的請求,如果我使用mergeMap則不會取消。

在分派多個動作方面,以下所有工作:

  • return [action1,action2]
  • 從([action1,action2])返回
  • 返回(action1,action2)

以下不起作用:

  • return([action1,action2]) - >效果“UserEffects.loadUser”調度無效動作:[object Object],[object Object]

所有前3個選項有什么區別? 在http請求之后mergeMap與switchMap怎么樣? 為什么最后一個選項不起作用?

這個問題可以分為幾個部分:

+)mergeMap和switchMap之間的區別:

  • mergeMap = map + mergeAll。 它將數據流映射到可觀察流,並且每次內部observable發出值時,外部將收集所有發出的值並將其合並到新流中。

  • switchMap ,非常相似,但正如你可以告訴它“開關”,即如果下一個內部observable發出一個新值,前一個被取消(一次內部可觀察)。

+)mergeMap和switchMap之間的相似性:它們都可以將任何類似流的對象轉換為可觀察對象。

+)您的代碼之間的差異:

  • return [action1,action2]確實使switchMap(()=> ...)類似於from([action1,action2]),即從數組創建一個observable。

  • 從([action1,action2])返回,這是一個內部observable,它發出2個動作,switchMap將這些動作合並回它的流。

  • 從([action1,action2])返回(action1,action2)=

  • 但是,返回([action1,action2])會創建一個發出單個值的observable,這是一個數組,你不能調用store.dispatch(array_of_actions)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM