- Observbale 对象可以看作一个数据集合,但这个数据集合可以不是一次产生,而是在一个时间段上逐个产生每个数据,因为这,一个 observable 对象即使产生超庞大的数据,依然不会消耗很多内存,因为每一次只产生一个,吐出来之后再产生另一个,不会挤压;
- 每一个操作符都需要考虑: 返回一个全新的 observable 对象、对上游和下游的订阅及退订处理、处理异常情况,及时释放资源;
- 为什么使用 pipe 来组合操作数?好处:1. 它通过删除操作符来清除 Observable.prototype 2. 让 rxjs 的库更加容易被摇树优化 3. 更易写和使用第三方操作数,因为不需要给OBservable.prototype打补丁;
- Throttle 和 debounce, 节流和去抖动; throttleTime 的作用是限制在 duration 时间范围内,从上游传递给下游数据的个数,debounceTime 的作用是让传递给下游的时间间隔不能小于给定时间dueTime;
- combineLatest: 取得各个 observable 最后送出的值,再合并在一起输出一个observable;zip 会取每个 observable 相同顺位的元素组合成一个 observable;(平时没事不要用 zip, 除非真的需要,因为zip必须cache 住还没处理的元素,当两个 observable 一个快一个慢时,就会 cache 非常多的元素,这很可能会产生内存泄漏);
- scan 就是 observable 版本的 reduce, scan 和 reduce 最大的差别就是 scan 一定会回传一个 observable,而 reduce 最后回传的值可以是别的类型;scan 经常用来计算状态的处理;
- Distinct() 用来过滤掉重复元素;(这个可以用来优化数据);
- distinctUntilChanged 会跟最后一次送出的元素相比,不会每个都比;比如[a, b, c, c, b]会输出[a, b, c, b],也就是说不会出现相邻的两个数;
- 通过 from(obj: Promise) 得到的observable 无法使用 retry 使其再次执行,需要用defer 再次封装后才可以触发 retry,比如 defer(() => from(obj: Promise))
- groupBy 会把相同条件的元素拆成一组;
- 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)
)))
来源:oschina
链接:https://my.oschina.net/hyzccc/blog/3197592