Reactjs 如何使用redux observable在一个epic中发出多个动作?
我是rxjs/redux observable的新手,想做两件事: 1) 改进这部史诗,使其更加地道 2) 从一部史诗中分派两个动作 我看到的大多数示例都假设api库在获取失败时会抛出异常,但我的设计更具可预测性,对于Typescript联合类型,我必须先检查Reactjs 如何使用redux observable在一个epic中发出多个动作?,reactjs,typescript,rxjs,redux-observable,Reactjs,Typescript,Rxjs,Redux Observable,我是rxjs/redux observable的新手,想做两件事: 1) 改进这部史诗,使其更加地道 2) 从一部史诗中分派两个动作 我看到的大多数示例都假设api库在获取失败时会抛出异常,但我的设计更具可预测性,对于Typescript联合类型,我必须先检查ok:boolean值,然后才能解包结果,因此理解如何在rxjs中执行此操作更具挑战性 改善以下方面的最佳方法是什么?如果请求成功,我希望发出一个成功操作(意味着用户被授权)和一个“获取帐户”操作,这是一个单独的操作,因为有时我需要在“登录
ok:boolean
值,然后才能解包结果,因此理解如何在rxjs中执行此操作更具挑战性
改善以下方面的最佳方法是什么?如果请求成功,我希望发出一个成功操作(意味着用户被授权)和一个“获取帐户”操作,这是一个单独的操作,因为有时我需要在“登录”之外获取帐户。任何帮助都将不胜感激
const authorizeEpic: Epic<ActionTypes, ActionTypes, RootState> = action$ =>
action$.pipe(
filter(isActionOf(actions.attemptLogin.request)),
switchMap(async val => {
if (!val.payload) {
try {
const token: Auth.Token = JSON.parse(
localStorage.getItem(LOCAL_STORAGE_KEY) || ""
);
if (!token) {
throw new Error();
}
return actions.attemptLogin.success({
token
});
} catch (e) {
return actions.attemptLogin.failure({
error: {
title: "Unable to decode JWT"
}
});
}
}
const resp = await Auth.passwordGrant(
{
email: val.payload.email,
password: val.payload.password,
totp_passcode: ""
},
{
url: "localhost:8088",
noVersion: true,
useHttp: true
}
);
if (resp.ok) {
return [
actions.attemptLogin.success({
token: resp.value
})
// EMIT action 2, etc...
];
}
return actions.attemptLogin.failure(resp);
})
);
const-authorizeEpic:Epic=action$=>
动作$.pipe(
筛选器(isActionOf(actions.attemptLogin.request)),
开关映射(异步val=>{
如果(!val.payload){
试一试{
const-token:Auth.token=JSON.parse(
localStorage.getItem(本地存储密钥)| |“”
);
如果(!令牌){
抛出新错误();
}
return actions.attemptLogin.success({
代币
});
}捕获(e){
return actions.attemptLogin.failure({
错误:{
标题:“无法解码JWT”
}
});
}
}
const resp=wait Auth.passwordGrant(
{
电子邮件:val.payload.email,
密码:val.payload.password,
totp_密码:“
},
{
url:“本地主机:8088”,
小说:没错,
useHttp:true
}
);
如果(分别正常){
返回[
actions.attemptLogin.success({
令牌:resp.value
})
//发出动作2等。。。
];
}
返回操作.attemptLogin.failure(resp);
})
);
您可以压缩您的操作并返回它们
zip(actions.attemptLogin.success({
token: resp.value
})
// EMIT action 2, etc...
因此,现在将调用这两个操作。指示项目函数(示例中的lambda)可能返回以下内容:
type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T> | Iterable<T>
我没有您的TypeScript类型定义,因此无法验证上面的示例是否正确工作。然而,我已经在TypeScript、RxJS和redux observable的最新版本中取得了相当好的成功。上面没有什么突出的地方让我觉得您应该遇到任何问题。我试过了,得到了一个typescript错误,在运行get时出现了“操作必须是普通对象。使用自定义中间件进行异步操作。”错误。“操作必须是普通对象”可能是由于epic发出一个数组并发送到Redux存储。如果没有自定义中间件,Redux将无法接受阵列。