【发布时间】:2018-02-22 11:47:41
【问题描述】:
The docs 定义Observable.lift(operator: Operator) 为:
创建一个新的 Observable,以这个 Observable 为源,并且 传递的运算符定义为新的 observable 的运算符。
和Observable.pipe(operations: ...*) 为:
用于将功能运算符拼接成一个链。返回 调用所有操作符的可观察结果 按顺序传入。
很明显.pipe 可以接受多个运算符,而.lift 不能。但是pipe 也可以接受单个运算符,所以这不是唯一的区别。仅从文档来看,我不清楚它们的用途以及它们存在的原因。 谁能解释一下这些功能的用途,以及何时应该使用它们?
到目前为止的观察
以下代码(打字稿):
let myObservable = Observable.of(1, 2, 3);
let timesByTwoPiped = myObservable.pipe(map(n => n * 2));
let timesByTwoLift = myObservable.lift(new TimesByTwoOperator());
timesByTwoPiped.subscribe(a => console.log('pipe:' + a));
timesByTwoLift.subscribe(a => console.log('lift:' + a));
和TimesByTwoOperator:
class TimesByTwoOperator implements Operator<number, number> {
call(subscriber: Subscriber<number>, source: Observable<number>): void | Function | AnonymousSubscription {
source.subscribe(n => {
subscriber.next(n * 2);
});
}
}
似乎同时使用.lift 和.pipe 可以达到相同的结果。这个实验表明我认为提升和管道都可以用来实现同样的事情是正确的,尽管在这种情况下管道版本更简洁。
由于传递给.lift 的Operator 类型被授予对源可观察对象和订阅的完全访问权限,显然可以用它实现强大的功能;例如保持状态。但我知道.pipe 也可以实现同样的功能,例如buffer operator。
我仍然不清楚为什么它们都存在以及各自的设计目的。
【问题讨论】:
标签: javascript angular rxjs