2016-06-16 33 views
0

为什么您必须链接可观察的实例方法才能使其工作。如果将一个observable赋值给一个变量,然后应用一个新的observable方法,则不会调用该新方法。RxJS分配变量的可观测方法

例如,这个工程:

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>

但这并不最后调用()方法:

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>

回答

1

天文台ble方法不会将操作添加到原始的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>