2016-06-16 94 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>