Rxjs在Angular中如何更好的与component拆分或者解耦

发布于 2022-09-06 19:39:24 字数 340 浏览 11 评论 0

图片描述
图片描述

发现在component里写着写着就越来越长了,如何把这些逻辑处理写到service中,在service处理后返回成功或失败给组件,组件只负责显示这些处理后的东西

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

心舞飞扬 2022-09-13 19:39:24

很多数据以及业务逻辑的处理可以在LoginService中做完, 返回一个observable,返回值是你希望返回到component中最终的数据。

login(user: User): Observable<any> {
   return this.callApi(user).map(() => {
        ......
        localStorage.......
        return your data;
   });
}

这样你在component中订阅到这个observable时, 返回的就是你想要的结果,而不需要做额外的业务处理。

this.loginService.getUser(user).subscribe((data: any) => {}, (err: Error) => {});

而且还有一点就是, 你在getUser的订阅中,又调用了另外一个Observable setUserInfo, 尽量不要使用subscribption的嵌套

你完全可以将这两个流写到一起, 使用flatMap

login(user: User): Observable<any> {
 return this.callApi(user).flatMap(() => {
    ......
    localStorage.......
    return this.setUsernfo(user);
}).map(() = > {
   set user info
 };
}
情深已缘浅 2022-09-13 19:39:24

往组件里面注入服务

偏爱自由 2022-09-13 19:39:24

可以在service里面写个promise来把传来的数据resolve给组件。

然后,比如try catch捕获异常给反馈,数据是空的给反馈,获取到了数据才做后续动作。

# login.service.ts

getloginData = () => {
  return new Promise((resolve, reject) => {
    this.login(user).subscribe(
      (next) => {
        resolve(next);
      },
      (error) => {
        reject(error);
      }
    );

  });

};


你的component.ts

data: any[] = [];

submit = async () => {
  ...

  try() {
    data = await this.loginService.getloginData();
    if(data.length <= 0) {
      console.error("啊 data不见啦!");
      ...
    }
    ...
  } catch (err) {

    ...(处理异常)
  }

  
  
};
标点 2022-09-13 19:39:24

service加一个强类型转换,业务层就直接使用data就行了,类似于这样:

  class NewsList {
      data:{
          id: string;
          title: string;
          cate_price:string;
      }
    }
  getDetail(id){
    return this.http.get<NewsDetail>(`http://xxx.com/api/news/news_detail?id=${id}`)
  }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文