Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 如何使用redux observable在一个epic中发出多个动作?_Reactjs_Typescript_Rxjs_Redux Observable - Fatal编程技术网

Reactjs 如何使用redux observable在一个epic中发出多个动作?

Reactjs 如何使用redux observable在一个epic中发出多个动作?,reactjs,typescript,rxjs,redux-observable,Reactjs,Typescript,Rxjs,Redux Observable,我是rxjs/redux observable的新手,想做两件事: 1) 改进这部史诗,使其更加地道 2) 从一部史诗中分派两个动作 我看到的大多数示例都假设api库在获取失败时会抛出异常,但我的设计更具可预测性,对于Typescript联合类型,我必须先检查ok:boolean值,然后才能解包结果,因此理解如何在rxjs中执行此操作更具挑战性 改善以下方面的最佳方法是什么?如果请求成功,我希望发出一个成功操作(意味着用户被授权)和一个“获取帐户”操作,这是一个单独的操作,因为有时我需要在“登录

我是rxjs/redux observable的新手,想做两件事:

1) 改进这部史诗,使其更加地道

2) 从一部史诗中分派两个动作

我看到的大多数示例都假设api库在获取失败时会抛出异常,但我的设计更具可预测性,对于Typescript联合类型,我必须先检查
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将无法接受阵列。