rxjs:我可以在定义observable之前订阅吗?

rxjs:我可以在定义observable之前订阅吗?,rxjs,Rxjs,我是rxjs新手(暂时帮助另一个项目),所以我觉得我一定是在文档中遗漏了一些东西。下面是我正在研究的内容的简化版本,其中涉及到与现有事件总线的集成: function thirdPartyStuff( callback ) { for ( let i = 0; i < history.length; i++ ) { callback( history[ i ] ); // gets called now if event history exists } this.ca

我是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 ) );
}

我想知道的是,是否存在更好的方法,或者我真的坚持使用
setTimeout

这样设置您的函数:

makeObservable() {
  const rs = new ReplaySubject();
  const obs = new Observable( observer => {
    this.thirdPartyStuff( function( thing ) {
      observer.next( thing );
    });
  } ).pipe(
    share()
  );

  obs.subscribe(rs);
  return rs;
}

现在,在调用函数时,子克隆会立即发生,任何订户都会立即获取最后一个发出的值,或者在它到达时获取下一个发出的值。

它们都不起作用,因为我需要发送完整的历史记录,而不仅仅是最后一个。有“全部”重播吗?(我的意思是,这和您对“shareReplay”的第一个回答都不一样)只是不向replay主题提供参数,这会导致replay计数为无限。您可以对shareReplay执行相同的操作。出于好奇,这个解决方案有效吗?我更改了我的答案,因为我认为shareReplay在至少有一个订阅者存在之前不会开始缓存排放,但如果它真的起作用,我可能会弄错。我实际上使用shareReplay是因为它起作用而且更简单——在您编辑并试用它之前,我看到了您的第一个答案。我只知道rxjs中有这么多的操作符,一定有办法做到这一点,所以我并不奇怪至少有两个操作符。经过两天的体验,我已经是rxjs的粉丝了,因为它是如此的多才多艺。
makeObservable() {
  const rs = new ReplaySubject();
  const obs = new Observable( observer => {
    this.thirdPartyStuff( function( thing ) {
      observer.next( thing );
    });
  } ).pipe(
    share()
  );

  obs.subscribe(rs);
  return rs;
}