我是rxjs的新手(暂时帮助另一个项目),所以我觉得我一定在文档中缺少某些内容。这是我正在工作的简化版本,其中涉及与现有事件总线集成:
function thirdPartyStuff( callback ) {
for ( let i = 0; i < history.length; i++ ) {
callback( history[ i ] ); // gets called now if event history exists
}
this.callbacks.push( callback ); // will be called later when more happen
}
function makeObservable() {
return new Observable( observer => {
this.thirdPartyStuff( function( thing ) {
observer.next( thing );
} );
} ).pipe(
share()
);
}
function runMyCode() {
this.monitor = this.makeObservable();
return this.monitor.subscribe( thing => console.log( thing ) );
}
我的问题是,如果history
中有东西,observer.next
会在subscribe
之前被调用。我已经这样解决了这个问题:
function makeObservable() {
return new Observable( observer => {
setTimeout( () => { // delay observer.next until subscribe exists
this.thirdPartyStuff( function( thing ) {
observer.next( thing );
} );
} );
} ).pipe(
share()
);
}
我想知道的是,是否存在更好的方法,或者我真的坚持使用setTimeout
?
答案 0 :(得分:1)
像这样设置您的功能:
makeObservable() {
const rs = new ReplaySubject();
const obs = new Observable( observer => {
this.thirdPartyStuff( function( thing ) {
observer.next( thing );
});
} ).pipe(
share()
);
obs.subscribe(rs);
return rs;
}
现在,该函数被调用后立即发生订阅,任何订阅者都立即获得上一个发射值或到达时获得下一个发射值。