【问题标题】:redux-observable - difference between concat vs concatMapredux-observable - concat 与 concatMap 之间的区别
【发布时间】:2019-06-10 11:41:10
【问题描述】:

在使用 redux-observable 时,我试图弄清楚 concatconcatMap 之间的区别。

凭我的直觉,我认为 concatMap 会起作用: - 从 FAKE_LOGIN 动作,它将被 switchMap-ed 以发出 FAKE_LOGIN_AUTHENTICATING 动作。 - 在 FAKE_LOGIN_AUTHENTICATING 动作中,将在 2 秒延迟后 concatMap-ed 发出 FAKE_LOGIN_SUCCESS 动作。

但是,上面的想法是行不通的。我尝试了各种组合,最后偶然发现了 concat 运算符,令人惊讶的是它可以工作。

两者有什么区别?

以下是我的代码:

不起作用工作

action$.pipe(
  switchMap(
    action => of( { type: 'FAKE_LOGIN_AUTHENTICATING' } ).pipe(
      concatMap( thing => {
        return of( { type: 'FAKE_LOGIN_SUCCESS', payload: { userId: 'user-a', userData: {} } } ).pipe(
          delay( 2000 )
        );
      } )
    )
  )
);

但这确实

action$.pipe(
  switchMap(
    action => of( { type: 'FAKE_LOGIN_AUTHENTICATING' } ).pipe(
      concat(
        of( { type: 'FAKE_LOGIN_SUCCESS', payload: { userId: 'user-a', userData: {} } } ).pipe(
          delay( 2000 )
        )
      )
    )
  )
);

【问题讨论】:

    标签: rxjs redux-observable


    【解决方案1】:

    我想我并不完全理解您的用例,但 concatMapconcat 之间的主要区别在于 concatMap 接受一个函数作为参数,该函数从其源中为每个项目调用并返回一个内部的 Observable(它将每个项目从其源映射到一个 Observable)。 concatMap 然后只有在之前的内部 Observables 完成时才调用它的回调。

    另一方面,concat 只接受一个 Observable 列表,并在前一个 Observable 完成时一个接一个地订阅它们。

    所以在你的情况下,第一个例子只是“映射”FAKE_LOGIN_AUTHENTICATINGFAKE_LOGIN_SUCCESS

    在第二个例子中,内部块等价于:

    concat(
      of({ type: 'FAKE_LOGIN_AUTHENTICATING' }),
      of({ type: 'FAKE_LOGIN_SUCCESS', payload: { userId: 'user-a', userData: {}}}).pipe(
        delay(2000),
      )
    )
    

    所以它首先订阅of({ type: 'FAKE_LOGIN_AUTHENTICATING' }),它立即发出并完成,然后订阅of({ type: 'FAKE_LOGIN_SUCCESS'...),它也立即发出,然后完成。

    【讨论】:

      猜你喜欢
      • 2019-05-14
      • 2014-12-08
      • 2020-04-17
      • 2016-07-14
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      相关资源
      最近更新 更多