「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」。
Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~
实验目标:
将来自不同接口的数据合并到一个字段中使用。
环境及依赖:
- vite:
^2.6.4
;
- rxjs:
6.6.6
;
- axios:
^0.24.0
;
- vue3+ts(Angular默认支持RxJs,Vue默认不配置RxJs相关内容,所以更能体现创建类的操作符);
- 数据来源:JSONPlaceholder。
创建操作符:
- from:核心操作,没有Observable对象就无从谈起响应式编程,from操作符将接口返回的Promise对象(像Observable对象)转为Observable对象。
合并操作符:
- zip:
- 特点:拉链式组合(一对一组合);
- 目的:将两个接口的结果按合并顺序存在数组中。
过滤操作符:
- filter:查看数据是否都正常返回,期间使用数组的
every
函数保证每个接口状态均为200。
转换操作符:
- map:将接口返回的巨型数据只保留业务相关的data内容返回。
实现过程:
- 导入相关依赖:
| import axios from 'axios' |
| import { from, zip } from 'rxjs'; |
| import { filter, map } from 'rxjs/operators'; |
- 将接口返回的promise对象转换为observable对象:
| const observable1 = from(axios.get('https://jsonplaceholder.typicode.com/todos/1')); |
| const observable2 = from(axios.get('https://jsonplaceholder.typicode.com/posts/1/comments')); |
- 定义接收对象:
- 通过Rxjs的相关操作符进行数据处理:
| |
| zip(observable1, observable2) |
| |
| .pipe( |
| |
| filter(res => res.every(res => res.status === 200)), |
| |
| map(res => res.map(res => res.data)), |
| ).subscribe(res => { |
| |
| response = { |
| ...res[0], |
| comments: res[1], |
| } |
| console.log(response); |
| }) |
- 合并结果展示:
| { |
| "userId": 1, |
| "id": 1, |
| "title": "", |
| "completed": false, |
| "comments": [ |
| { |
| "postId": 1, |
| "id": 1, |
| "name": "", |
| "email": "", |
| "body": "" |
| } |
| ] |
| } |
欢迎关注我的公众号“前端小鑫同学”,原创技术文章第一时间推送。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)