在rxjs中嵌套和展平有什么区别?

时间:2019-12-09 11:38:01

标签: reactjs redux rxjs redux-observable

我使用的是redux observable,我对应该将可观察变量嵌套在史诗中还是将其扁平化感到有些困惑。

我有一个简单的史诗,可以执行一个动作,触发一个承诺,然后等待结果触发带有有效负载的另一个动作。

这可以完成工作...

export const stageTitleUpdate = action$ =>
  action$.pipe(
    ofType('projects/updateTitle'),
    debounceTime(1000),
    switchMap(
      ({ payload }) => from(later(2000, payload))
    ),
    map(res => fetchFulfilled(res))
  );

我也可以这样写,并且似乎产生完全相同的结果...

export const stageTitleUpdate = action$ =>
  action$.pipe(
    ofType('projects/updateTitle'),
    debounceTime(1000),
    switchMap(
      ({ payload }) => from(later(2000, payload))
      .pipe(
         map(res => fetchFulfilled(res))
      )
    ),

  );

两者之间有区别吗?仅仅是文体上的,还是将来会用这种方式写成另一种方式?

1 个答案:

答案 0 :(得分:1)

我学到的主要区别之一是

from(later(2000, payload))流是内部可观察的。

两种样式均有效,但是逻辑内部可观察的逻辑将使您将错误包含在内部范围内,并使源可观察的逻辑保持流动,而不是完成或引发错误。

Style1-即使from(later(2000, payload))或fetchFulfilled(res)抛出错误,即使您在外部流中使用catchError,整个流也将停止发光。

export const stageTitleUpdate = action$ =>
  action$.pipe(
    ofType('projects/updateTitle'),
    debounceTime(1000),
    switchMap(
      ({ payload }) => from(later(2000, payload))
    ),
    map(res => fetchFulfilled(res)),
    // this will complete your entire stream
    catchError(e=>of(e))
  );

Style2-如果您发现内部可观察的错误,则源将继续工作

export const stageTitleUpdate = action$ =>
  action$.pipe(
    ofType('projects/updateTitle'),
    debounceTime(1000),
    switchMap(
      ({ payload }) => from(later(2000, payload))
      .pipe(
         map(res => fetchFulfilled(res)),
         catchError(e=>of(e))
      )
    ),
  );

话虽如此,它仍然取决于您的上游和下游任务以及上游的哪种映射过程(mergeMap,switchMap,exhaustMap)。通常,如果您根据业务逻辑自然地进行流传输,则一切正常。即

const task2=task21().pipe(map(()=>task22())
task1().pipe(switchMap(_=>
   task
))