2017-04-11 69 views
1

如何將數據放入ConnectableObservable?我問這是一個可觀察的數據不可用,直到一個異步函數完成的情況。一個簡單的例子:將數據添加到ConnectableObservable

function myFunc() { 
    let observable = Rx.Observable.create().publish(); 
    setTimeout(() => console.info('TIMEOUT') || observable.of('data').connect(), 300); 
    return observable; 
} 

myFunc().subscribe(x => console.log(x)); 

我也曾嘗試

observable.map(() => 'data').connect() 
observable.flatMap(() => Observable.of('data')).connect() 

在我的例子中沒有成功替代.of()

回答

1

Observables does not have the connect() method。唯一的例外是ConnectableObservable,例如由publish()運算符返回。

例如,您可以執行以下操作:

let source = Observable.create(observer => { 
    const timer = setTimeout(() => observer.next('data'), 300); 

    return() => { 
     clearTimeout(timer); 
    }; 
}).publish(); 

source.connect(); 
source.subscribe(console.log); 

編輯:

let observable = Rx.Observable.create(...) 
    .publish(); 

let o1 = observable 
    .map(val => true) 
    .flatMap(...) 
    .subscribe(...); 

observable.connect(); 

......或者......

let observable = Rx.Observable.create(...); 
let o1 = observable 
    .map(val => true) 
    .flatMap(...) 
    .publish(); 

o1.subscribe(...); 
o1.connect(); 
+0

這就是爲什麼'observable'是'ConnectableObservable '。我正在尋找一種方法,在初始創建類似於deferred = $ q.defer()'',deferred.resolve('data')'後,改變observable。 – Raven

+0

但是你使用'observable.map(()=>'data')。connect()'永遠不會工作,因爲'map()'總是隻返回'Observable'而不是'ConnectableObservable'。 – martin

+0

這是我不知道的。你不能'.map()''ConnectableObservable'到'ConnectableObservable'嗎?另外我不需要使用'.map()'。我只是想以延遲的方式將數據添加到「Observable」後面。類似於'$ q'的'deferred'。 – Raven