编辑:对于 RxJS 6 或更高版本,请阅读do
as tap
.
do
用于副作用。subscribe
用于调用可观察的。更换do
with subscribe
造成不良结果。更换subscribe
with do
甚至不会调用流。
考虑这些例子:
Using 订阅 :
const testObservable = Rx.Observable.create(function(observer){
console.log('some heavy task, may be network call ');
observer.next('success');
});
testObservable.subscribe(function(res){
console.log('action 1');
});
testObservable.subscribe(function(res){
console.log('action 2');
});
上述代码的输出是
"some heavy task, may be network call "
"action 1"
"some heavy task, may be network call "
"action 2"
您可以看到Rx.Observable.create
被处决两次。我们的目标是只做一次但是与操作 2 一起执行操作 1 also.
Using do:
const testObservable = Rx.Observable.create(function(observer){
console.log('some heavy task, may be network call ');
observer.next('success');
});
testObservable
.do(function(res){
console.log('action 1');
})
.subscribe(function(res){
console.log('action 2');
});
输出将是
"some heavy task, may be network call "
"action 1"
"action 2"
这就是我们真正想要的。我们需要“行动 2”,但在此之前还需要执行“行动 1”。
为什么叫副作用:
因为它不会像其他运算符那样影响流的流量。它接受响应,执行某些操作,即使它修改了响应,流也会忽略它。例如:
testObservable
.do(function(res){
console.log('action 1');
return res+'some other text';
})
.subscribe(function(res){
console.log('action 1');
});
上面的代码仍然会给出与以前相同的输出。所以无论你执行什么do
流将忽略它并继续执行。
如果我们正在进行纯粹的“函数反应式编程”,我们不希望流中出现任何副作用。所以,do
不鼓励使用,并且主要仅用于调试目的。