【发布时间】:2019-11-21 04:17:58
【问题描述】:
我正在尝试在 rxjs 中实现一个场景:
- 我对 api 进行 ajax 调用以获取一些数据。
- 如果 jwt 令牌已过期,我会收到更新后的响应 令牌
- 如果token已经更新,需要重新执行之前的API 打电话
- 如果不是,我照常返回结果。
为此,我尝试在更新令牌时在 map() 中执行一个承诺,以重新执行初始 API 调用
每当它说:“动作必须是普通对象。使用自定义中间件进行异步动作”——
const fetchEpic = (action$, store) =>
action$.pipe(filter(filterActions)).pipe(
mergeMap((actionParams) => {
const ajaxObservables = ajax(request).pipe(
takeUntil(action$.ofType(`${type}_CANCEL`, CANCEL_ALL_FETCH)),
map( ({ response: payload}) => {
if (payload.tokenUpdated) {
const promiseFetch = () => new Promise(resolve => {
ajax(request).pipe(map(({ response }) => resolve(response)));
});
return from(promiseFetch).pipe(
concatMap((result) => of(
{ type: SET_USER_TOKENS, payload },
{...onCompleteAction, payload: result, extraParameters}
)),
catchError(err => {
console.log(err)
})
);
}
else if (isJWTError(payload)) {
return ({ type: USER_LOGOUT })
} else {
return ({...onCompleteAction, payload, extraParameters});
}
}),
catchError(({ xhr: { response: payload }}) => {
const obsLogoutAction = (of({ type: USER_LOGOUT, error: true}));
const obsReturnAction = (of({ type, payload, error: true}));
if (isJWTError(payload)) {
return obsLogoutAction;
}
return obsReturnAction
})
);
let obs = [...loadingActionObservable, ajaxObservables ];
return concat(...obs);
}));
【问题讨论】:
标签: rxjs6