为什么必须链接可观察的实例方法才能使它们起作用。如果将一个observable赋给变量,然后应用一个新的observable方法,则不会调用新方法。
例如,这有效:
var source = Rx.Observable.range(1, 3)
.map(function (x) {
return x;
})
.finally(function() {
console.log("Finally");
});
var subscription = source.subscribe(
function (x) {
console.log('Next: ' + x);
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.28/rx.all.min.js"></script>
但是这不会调用finally()方法:
var source = Rx.Observable.range(1, 3)
.map(function (x) {
return x;
});
// This is never called
source.finally(function() {
console.log("Finally");
});
var subscription = source.subscribe(
function (x) {
console.log('Next: ' + x);
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.28/rx.all.min.js"></script>
答案 0 :(得分:1)
可观察方法不会向原始observable添加操作,然后返回原始observable以传递给该行。他们实际上返回了一个新的观察者。
上面的第二个例子不起作用,因为source.finally()不会将finally()方法附加到源observable。相反,它返回一个新的observable,它将调用finally()方法。所以在这个例子中,源变量不知道source.finally()被调用了。为了使示例两个工作,我们需要以下内容:
var source = Rx.Observable.range(1, 3)
.map(function (x) {
return x;
});
source = source.finally(function() {
console.log("Finally");
});
var subscription = source.subscribe(
function (x) {
console.log('Next: ' + x);
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.28/rx.all.min.js"></script>