redux-observable - concat 与 concatMap 之间的区别
redux-observable - difference between concat vs concatMap
在使用 redux-observable.
根据我的直觉,我认为 concatMap 会起作用:
- 从 FAKE_LOGIN
动作中,它将被 switchMap 编辑以发出 FAKE_LOGIN_AUTHENTICATING
动作。
- 在 FAKE_LOGIN_AUTHENTICATING
动作中,它会被 concatMap-ed 发出 FAKE_LOGIN_SUCCESS
动作,延迟 2 秒后。
但是,上面的思路是行不通的。我尝试了各种组合,最后偶然发现了 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 )
)
)
)
)
);
我想我不完全理解你的用例,但 concatMap
和 concat
之间的主要区别是 concatMap
接受作为参数调用的函数每个项目都来自它的源,并且 returns 一个内部 Observable(它将每个项目从它的源映射到一个 Observable)。 concatMap
然后仅当先前的内部 Observable 完成时才调用其回调。
另一方面,concat
只接受一个 Observable 列表,并在前一个 Observable 完成时一个接一个地订阅它们。
因此在您的情况下,第一个示例只是“映射”FAKE_LOGIN_AUTHENTICATING
到 FAKE_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'...)
。
在使用 redux-observable.
根据我的直觉,我认为 concatMap 会起作用:
- 从 FAKE_LOGIN
动作中,它将被 switchMap 编辑以发出 FAKE_LOGIN_AUTHENTICATING
动作。
- 在 FAKE_LOGIN_AUTHENTICATING
动作中,它会被 concatMap-ed 发出 FAKE_LOGIN_SUCCESS
动作,延迟 2 秒后。
但是,上面的思路是行不通的。我尝试了各种组合,最后偶然发现了 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 )
)
)
)
)
);
我想我不完全理解你的用例,但 concatMap
和 concat
之间的主要区别是 concatMap
接受作为参数调用的函数每个项目都来自它的源,并且 returns 一个内部 Observable(它将每个项目从它的源映射到一个 Observable)。 concatMap
然后仅当先前的内部 Observable 完成时才调用其回调。
另一方面,concat
只接受一个 Observable 列表,并在前一个 Observable 完成时一个接一个地订阅它们。
因此在您的情况下,第一个示例只是“映射”FAKE_LOGIN_AUTHENTICATING
到 FAKE_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'...)
。