Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >RxJS:解开嵌套的可观测对象

RxJS:解开嵌套的可观测对象
EN

Stack Overflow用户
提问于 2018-09-19 14:37:28
回答 2查看 42关注 0票数 0

我正在寻找一个比我现有的解决方案更具可读性的解决方案。

我需要: 1)从API检索产品。它们是一个对象数组。2)根据类别等过滤产品。3)对产品进行分页并返回这些产品的分页版本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ngOnInit() {

//This gets the products from the API 
    this.drinkSubscription = this.drinkService.getAllDrinks().subscribe(drinks => {

//Save products without pagination for other purposes
      this.allDrinks = drinks;

//Get the parameter to filter products
      this.paramSubscription =  this.route.params.subscribe((params: Params) => {

//Filter the products and return a filtered array
        const filteredDrinks = this.filterService.filter(drinks, params['filter'], params['name']);

//Sort products based on the selection
        this.sorterSubscription = this.sorter.initialize(filteredDrinks).subscribe(sortedDrinks => {

//Create a pager that holds the paginated drinks in a property
          this.pagerSubscription = this.pagerService.initializePaginatedItems(sortedDrinks, 10, 5)
                                  .subscribe(pager => {
                                    this.pager = pager;
                                    this.paginatedDrinks = pager.paginatedItems;
                                  });
        });
      });
    });
  }

排序器和分页是BehaviorSubjects的,所以我可以注入next(),但我对它们不是很确定……您可以看到缩进的级别相当高,我想知道是否有一种使用RxJS的方法可以以更易读的方式获得相同的结果。

EN

回答 2

Stack Overflow用户

发布于 2018-09-19 15:09:34

您应该能够使用运算符将它们组合在一起。我相信下面的方法应该是可行的。

combineLatest大致类似于Promise.all([p1,p2]) -只是它将在任何可见对象发出时发出,使用其他对象的先前值。

switchMap允许您获取从可观测对象发出的值,并将其映射到另一个可观测对象。

https://www.learnrxjs.io/operators/combination/combinelatest.html https://www.learnrxjs.io/operators/transformation/switchmap.html

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let drinkObservable = this.drinkService.getAllDrinks()
let paramsObervable = this.route.params

let sub = combineLatest(drinkObservable, paramsObervable)
  .pipe(switchMap(([drinks, params]) => {
    this.allDrinks = drinks
    let filteredDrinks = this.filterService.filter(drinks, params['filter'], params['name']);
    return this.sorter.initialize(filteredDrinks)
  }))
  .pipe(switchMap(sortedDrinks => {
    return this.pagerService.initializePaginatedItems(sortedDrinks, 10, 5)
  }))
  .subscribe(pager => {
    this.pager = pager;
    this.paginatedDrinks = pager.paginatedItems;
  })
票数 1
EN

Stack Overflow用户

发布于 2018-09-20 05:56:18

通常,subscribe中的subscribe是一种“代码气味”,它隐藏了“扁平化”策略的需求,该策略需要使用扁平化运算符之一来实现,例如mergeMap (又称flatMap)、switchMapexaustMapconcatMap (这是mergeMap,并将concurrency设置为1)。

在您的特定情况下,代码可能如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ngOnInit() {

//This gets the products from the API 
    this.drinkSubscription = this.drinkService.getAllDrinks().switchMap(drinks => {
      this.allDrinks = drinks;
      return this.route.params)
    })
    .switchMap((params: Params) => {
        const filteredDrinks = this.filterService.filter(drinks, params['filter'], params['name']);
        return this.sorter.initialize(filteredDrinks)
    })
    .switchMap(sortedDrinks => this.pagerService.initializePaginatedItems(sortedDrinks, 10, 5))
    .subscribe(pager => {
        this.pager = pager;
        this.paginatedDrinks = pager.paginatedItems;
     });
    });
  });
});

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52408401

复制
相关文章
Angular 组件动态传入模板
比如 ng-zorro项目中的 BackTop回到顶部 组件就支持自定义模板。 默认时可以使用<nz-back-top></nz-back-top>。获得这个图标。
mafeifan
2018/12/28
1.9K0
JavaScript框架比较:AngularJS vs ReactJS vs EmberJS
选择最适合项目需求的JavaScript框架,可以提高你发布有竞争力的web app的能力。 最后,你对基于JavaScript的app或网站找到了一条奇妙的思路。选择正确的框架可能对你项目的成功有着
前朝楚水
2018/04/03
12.7K0
JavaScript框架比较:AngularJS vs ReactJS vs EmberJS
《Ext JS模板与组件基本框架图----组件》
本节主要从七个方面讲解组件,组件时什么,它的作用,它的构架,以及怎么创建和周期还有常见的配置项,属性方法和事件以及其层级是什么都进行整理,希望对大家有帮助。
yaohong
2019/09/11
1.6K0
Vue组件化 模板 语法糖 函数 父子组件通信
支持:String、Number、Boolean、Array、Object、Date、Function、Symbol
有勇气的牛排
2023/06/25
2110
《Ext JS模板与组件基本知识框架图----模板》
最近在整理Ext JS的模板和组件,在参考《Ext JS权威指南》,《Ext JS Web应用程序开发指南》,《Ext JS API》等相关书籍后才写下这篇《Ext JS模板与组件基本知识思维导图》,由于篇幅较长,所以必须肢解与各位分享。想要《Ext JS模板与组件基本知识思维导图》原文档的可以与我联系。
yaohong
2019/09/11
3.2K0
Angular快速学习笔记(3) -- 组件与模板
1. 显示数据 在 Angular 中最典型的数据显示方式,就是把 HTML 模板中的控件绑定到 Angular 组件的属性。 使用插值表达式显示组件属性 要显示组件的属性,最简单的方式就是通过插值表达式 (interpolation) 来绑定属性名。 要使用插值表达式,就把属性名包裹在双花括号里放进视图模板,如 {{myHero}}。 import { Component } from '@angular/core'; @Component({ selector: 'app-root', te
JadePeng
2018/05/28
15.3K0
小程序开发实战(5):组件复用利器-模板
根据我们前面讲解的知识,很容易看出,这段布局代码的作用是绘制两行带背景色的方块,效果如图1所示。
蒙娜丽宁
2020/07/09
6800
小程序开发实战(5):组件复用利器-模板
设计模式——组件协作模式之模板方法模式
<2>、早绑定与晚绑定 结构化软件设计的流程是一种早绑定的写法,Library 写的比 Application 早,写得比较晚的调用实现比较早的程序就叫做早绑定;
Gnep@97
2023/08/10
1800
设计模式——组件协作模式之模板方法模式
2套后台模板HTML+整套Easyui皮肤组件-后台管理系统模板
最近又对之前的easyui主题做了点更新,自己挺喜欢layui风格的,正好赶上layui官方下线,所以就在之前基础上增加了一套仿layui风格的easyui主题,easyui1.5.0-1.10.0都可以用,修复了一些小错位及bug,全部组件都按照layui风格进行样式调整,下面是部分页面截图:
全栈程序员站长
2022/10/01
5.2K0
2套后台模板HTML+整套Easyui皮肤组件-后台管理系统模板
模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板
图论 最短路 SPFA 1 #include<cstdio> 2 #include<queue> 3 #include<cstring> 4 using namespace std; 5 c
attack
2018/04/12
32.6K0
【腾讯云 Cloud Studio 实战训练营】新手小试使用Cloud Studio 搭建移动端 H5 页面(Vue框架)
代码开发随着云计算技术的不断发展,云 IDE 也应运而生,以下是云 IDE 的一些特点:
gpsgisrs
2023/08/07
3200
【腾讯云 Cloud Studio 实战训练营】使用 Cloud Studio 快速构建 Vue + Vite 完成律师 H5 页面
Cloud Studio 是基于浏览器的集成式开发环境(IDE),为开发者提供了一个稳定的云端工作站。
用户10701426
2023/08/26
2850
【腾讯云 Cloud Studio 实战训练营】使用 Cloud Studio 快速构建 Vue + Vite 完成律师 H5 页面
【愚公系列】2022年02月 微信小程序-组件模板和组件样式
组件模板的写法与页面模板相同。组件模板与组件数据结合后生成的节点树,将被插入到组件的引用位置上。
愚公搬代码
2022/02/28
3560
uni-app自定义弹窗模板uniPop组件
uni-app自定义弹窗uniPop.vue模板|uniapp仿微信弹窗/仿ios弹窗效果|msg信息框|alert对话框|loading提示框
andy2018
2019/09/28
24K9
uni-app自定义弹窗模板uniPop组件
如何实现 CLI 通过模板批量生成组件文件?
上一篇 《如何用 Node.js 实现一个微型 CLI》 中介绍了如何使用 CLI 以及如何实现一个简单的问答式CLI。在文章的最后也提到我对于目前这个 CLI 还有一些想法以及一些可以改进和优化的地方,所以现在我来兑现了。
林小帅
2020/05/28
9280
如何实现 CLI 通过模板批量生成组件文件?
【腾讯云Cloud Studio实战训练营】用Vue+Vite快速构建完成律师H5页面
Cloud Studio 是基于浏览器的集成式开发环境(IDE),为开发者提供了一个永不间断的云端工作站。用户在使用 Cloud Studio 时无需安装,随时随地打开浏览器就能在线编程。
亦世凡华、
2023/08/14
2760
【腾讯云Cloud Studio实战训练营】用Vue+Vite快速构建完成律师H5页面
17、将数据渲染到组件(列表渲染、模板语法、父子组件之间的传值)
(1)v-for语法 https://cn.vuejs.org/v2/guide/list.html 我们用 v-for 指令根据一组数组的选项列表进行渲染。v-for 指令需要使用 item in items形式的特殊语法,items 是源数据数组并且 item 是数组元素迭代的别名。
Ewall
2018/09/04
4.4K0
17、将数据渲染到组件(列表渲染、模板语法、父子组件之间的传值)
【腾讯云 Cloud Studio 实战训练营】体验搭建一个软件系统,无经验也能做开发
云计算技术的不断发展为代码开发带来了全新的体验,云 IDE(Integrated Development Environment)应运而生。腾讯云还与 CODING 联合推出的一站式云 IDE——Cloud Studio。我们将探讨云 IDE 的优势、特点以及体验,同时使用 Cloud Studio 快速搭建一个移动端 H5 页面,深入感受云 IDE 给我们带来的便利。
Swift社区
2023/07/31
1.4K0
【腾讯云 Cloud Studio 实战训练营】体验搭建一个软件系统,无经验也能做开发
调研技术组件模板V1 —— 以 Drools 为例
Drools通过 事实、规则和模式相互组合来完成工作,drools在开源规则引擎中使用率最广,但是在国内企业使用偏少,保险、支付行业使用稍多。
知一
2021/12/07
8090
调研技术组件模板V1 —— 以 Drools 为例
10+个很酷的VueJS组件,模板和实验示例
BootstrapVue Argon Dashboard PRO是BootstrapVue和Vue.js的高级仪表板。这是一种全新产品,它基于我们从头开始重新构建的最新框架结构,这种结构旨在使产品更直观,更具适应性,并且更易于定制。让Argon以其酷炫的功能给你带来惊喜,让你的项目达到一个全新的水平。
前端达人
2020/06/24
2.2K0

相似问题

addEventListener(“事件”,回调)与addEventListener(“事件”,函数(){回调() })

11

Javascript addEventListener回调逻辑

416

带有addeventlistener的回调函数

24

addEventListener :如何限制回调函数?

20

使用addEventListener理解javascript回调

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文