「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」。

Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~


实验目标:

将来自不同接口的数据合并到一个字段中使用。

环境及依赖:

  1. vite^2.6.4
  2. rxjs6.6.6
  3. axios^0.24.0
  4. vue3+tsAngular默认支持RxJsVue默认不配置RxJs相关内容,所以更能体现创建类的操作符);
  5. 数据来源:JSONPlaceholder

    创建操作符:

  6. from:核心操作,没有Observable对象就无从谈起响应式编程,from操作符将接口返回的Promise对象(像Observable对象)转为Observable对象。

    合并操作符:

  7. zip

    1. 特点:拉链式组合(一对一组合);
    2. 目的:将两个接口的结果按合并顺序存在数组中。

      过滤操作符:

  8. filter:查看数据是否都正常返回,期间使用数组的every函数保证每个接口状态均为200。

    转换操作符:

  9. map:将接口返回的巨型数据只保留业务相关的data内容返回。

    实现过程:

  10. 导入相关依赖:

    1. import axios from 'axios'
    2. import { from, zip } from 'rxjs';
    3. import { filter, map } from 'rxjs/operators';
  11. 将接口返回的promise对象转换为observable对象:

    1. const observable1 = from(axios.get('https://jsonplaceholder.typicode.com/todos/1'));
    2. const observable2 = from(axios.get('https://jsonplaceholder.typicode.com/posts/1/comments'));
  12. 定义接收对象:

    1. let response = null;
  13. 通过Rxjs的相关操作符进行数据处理:

    1. // 合并两个observable对象
    2. zip(observable1, observable2)
    3. // 预处理
    4. .pipe(
    5. // 过滤数据:要求所有的接口状态必须为200
    6. filter(res => res.every(res => res.status === 200)),
    7. // 仅返回业务数据以供使用
    8. map(res => res.map(res => res.data)),
    9. ).subscribe(res => {
    10. // 将两次请求的数据合并到response对象中
    11. response = {
    12. ...res[0],
    13. comments: res[1],
    14. }
    15. console.log(response);
    16. })
  14. 合并结果展示:

    1. {
    2. "userId": 1,
    3. "id": 1,
    4. "title": "",
    5. "completed": false,
    6. "comments": [
    7. {
    8. "postId": 1,
    9. "id": 1,
    10. "name": "",
    11. "email": "",
    12. "body": ""
    13. }
    14. ]
    15. }

欢迎关注我的公众号“前端小鑫同学”,原创技术文章第一时间推送。