我使用的是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))
)
),
);
两者之间有区别吗?仅仅是文体上的,还是将来会用这种方式写成另一种方式?
答案 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
))