【发布时间】:2020-04-27 15:36:27
【问题描述】:
我有一个方法,它接受一个 observable 作为参数并返回另一个 observable(如果你对 Redux-Observable 有足够的了解,它有这个类型签名function (action$: Observable<Action>): Observable<Action>;
在该方法中,我需要 observable 在收到'POST_AND_GET_REQUEST' 操作时执行以下操作:
- 使用操作的有效负载部分为数组中的每个对象同步执行 POST 请求
- 这些同步调用完成后,执行 GET 请求
- 当GET请求返回响应时,则返回
'POST_AND_GET_SUCCESS'动作
我创建了一个 stackblitz 来说明我目前所拥有的:https://stackblitz.com/edit/rxjs-a2pwb8?file=index.ts
但这里的代码 sn-p 也是如此:
import { from, of, Observable } from 'rxjs';
import { filter, delay, mapTo, mergeMap, concatMap, tap, switchMap } from 'rxjs/operators';
// GOAL
// synchronously post each period, when that's finished perform a get request
// postPeriods should only console the final POST_AND_GET_SUCCESS string that all was successful
interface ActionModel {
type: string;
payload: any;
}
const postPeriods = (action$: Observable<ActionModel>) => action$.pipe(
filter(action => action.type === 'POST_AND_GET_REQUEST'),
mergeMap(action =>
from(action.payload).pipe(
concatMap(period => of(`${period} post success`).pipe(
delay(1000),
tap(() => console.log(`${period} post success`)),
// this is wrong - we only want this to emit once
switchMap(response => of('get success').pipe(map => of('POST_AND_GET_SUCCESS')))
))
),
)
);
const postRequestAction = from([{ type: 'POST_AND_GET_REQUEST', payload: ['period 1', 'period 2'] }]);
// this should be a single 'POST_AND_GET_SUCCESS'
postPeriods(postRequestAction).subscribe(val => console.log(val));
我知道switchMap 的位置是错误的,但我不知道如何链接from observable 或mergeMap 运算符以获得我想要的结果。
【问题讨论】:
-
嗯..你是说switchMap语句中的动作只有在payload中的两个项目都完成后才能执行?
-
@wentjun 是的,没错。
标签: reactjs typescript rxjs observable redux-observable