2017-06-26 39 views
0

我想圍繞着觀察者包裹我的頭。我知道當觀察者中的值發生變化時,observable會通知其所有用戶有所變化。我不確定爲什麼下面的代碼不起作用。我的理解是,一旦我在數組中添加另一個元素,訂閱者應該記錄新值或記錄所有值。瞭解Observable:不更新陣列用戶

有人能解釋爲什麼嗎?

import { Observable } from 'rxjs'; 

var numbers = [5, 1, 2, 7, 10]; 
// let source = Observable.from(numbers); 
let source = Observable.create(observer => { 
    for (let n of numbers) 
     observer.next(n); 

    observer.complete(); 

}); 

source.subscribe(
    value => console.log(`value is ${value}`), 
    error => console.log(`error is ${error}`), 
    () => console.log(`completed!`) 
); 

setTimeout(function() { 
    console.log("pushing new value"); 
    numbers.push(33); 
}, 3000); 

我試着評論observer.complete(),因爲我認爲這可能是罪魁禍首。

回答

0

操作符的observable(與您創建的observable類似)不會爲其onPush事件「偵聽」數組(缺省實現中沒有數組)。您將從流中獲得的值將是訂閱呼叫之前的數組中的值。可觀察本身只是一個函數,它只會「複製」這些值並逐個發出它們,您的數組不知道如何將值「推送」到流中。在反應式世界中,通常是一個流,你將存儲在數組中的大部分值都存儲在這些值的流中。

+0

所以你的意思是說我們不能複製數組作爲流?我們將不得不使用Subject而不是Observable? –

+0

您可以從數組中複製值的流,但是數組無法將值推送到現有的observable。 Observable通過調用下一個函數來釋放新值。您可以將您的數組「發送」到主題下一個功能,並且其所有訂閱者/操作員將這些值按下流 – LookForAngular