2017-04-11 61 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