rxjs:在定义可观察对象之前可以订阅吗?

时间:2019-07-23 22:58:20

标签: rxjs

我是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

1 个答案:

答案 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;
}

现在,该函数被调用后立即发生订阅,任何订阅者都立即获得上一个发射值或到达时获得下一个发射值。