gpt4 book ai didi

rxjs - redux-observable - concat 与 concatMap 之间的区别

转载 作者:行者123 更新时间:2023-12-05 00:48:01 25 4
gpt4 key购买 nike

在使用 redux-observable 时,我试图了解 concatconcatMap 之间的区别。

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

但是,上面的想法是行不通的。我尝试了各种组合,最后偶然发现了 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 )
)
)
)
)
);

最佳答案

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

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

因此,在您的情况下,第一个示例只是将 FAKE_LOGIN_AUTHENTICATING 映射到 FAKE_LOGIN_SUCCESS

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

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'...) 也立即发出然后完成。

关于rxjs - redux-observable - concat 与 concatMap 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54216169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com