再读《深入浅出 rxjs》的小收获

巧了我就是萌 提交于 2020-03-18 18:29:29

3 月,跳不动了?>>>

  1. Observbale 对象可以看作一个数据集合,但这个数据集合可以不是一次产生,而是在一个时间段上逐个产生每个数据,因为这,一个 observable 对象即使产生超庞大的数据,依然不会消耗很多内存,因为每一次只产生一个,吐出来之后再产生另一个,不会挤压;
  2. 每一个操作符都需要考虑: 返回一个全新的 observable 对象、对上游和下游的订阅及退订处理、处理异常情况,及时释放资源;
  3. 为什么使用 pipe 来组合操作数?好处:1. 它通过删除操作符来清除 Observable.prototype 2. 让 rxjs 的库更加容易被摇树优化 3. 更易写和使用第三方操作数,因为不需要给OBservable.prototype打补丁;
  4. Throttle 和 debounce, 节流和去抖动; throttleTime 的作用是限制在 duration 时间范围内,从上游传递给下游数据的个数,debounceTime 的作用是让传递给下游的时间间隔不能小于给定时间dueTime;
  5. combineLatest: 取得各个 observable 最后送出的值,再合并在一起输出一个observable;zip 会取每个 observable 相同顺位的元素组合成一个 observable;(平时没事不要用 zip, 除非真的需要,因为zip必须cache 住还没处理的元素,当两个 observable 一个快一个慢时,就会 cache 非常多的元素,这很可能会产生内存泄漏);
  6. scan 就是 observable 版本的 reduce, scan 和 reduce 最大的差别就是 scan 一定会回传一个 observable,而 reduce 最后回传的值可以是别的类型;scan 经常用来计算状态的处理;
  7. Distinct() 用来过滤掉重复元素;(这个可以用来优化数据);
  8. distinctUntilChanged 会跟最后一次送出的元素相比,不会每个都比;比如[a, b, c, c, b]会输出[a, b, c, b],也就是说不会出现相邻的两个数;
  9. 通过 from(obj: Promise) 得到的observable 无法使用 retry 使其再次执行,需要用defer 再次封装后才可以触发 retry,比如 defer(() => from(obj: Promise))
  10. groupBy 会把相同条件的元素拆成一组;
  11. retryWhen 把意外发生的元素放到一个 observable 中,让我们可以直接操作这个 observable, 并等到这个 observable 操作完后再重新订阅一次原本的 observable;我们通常会把 retryWhen 拿来做错误通知或是意外收集;如
This.http.post().pipe(retryWhen(errors => 
    Errors.pipe(
    scan((errCount, err) => {
        if(errorCount >= 3) {
            throw err;
        }
        Return errorCount +1;
      }, 0)
)))
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!