【问题标题】:Async pipe take values from Observable or Subject?异步管道从 Observable 或 Subject 获取值?
【发布时间】:2016-09-01 07:31:39
【问题描述】:

从 angular2

异步管道订阅 Observable 或 Promise 并返回它发出的最新值。当发出新值时,异步管道会标记要检查更改的组件。

就我而言,如果我希望异步订阅从 XMLHttpRequest 调用的 xhr.upload.onprogress 生成的事件。我应该创建一个主题还是 Observable?每次事件发生时,我都需要将它推送给这个(Subject 或 Observable)的所有订阅者(包括异步管道)

  xhr.upload.onprogress = (event) => {
    this._progress = Math.round(event.loaded / event.total * 100);
    this._subject.onNext(this._progress/100); // push the progress value to the async pipe who is the subscriber
  };

【问题讨论】:

    标签: angular


    【解决方案1】:

    您可以使用其中任何一种,但由于您需要设置观察者并使可观察对象变热,因此需要做更多的工作来处理原始可观察对象。然后就可以使用观察者来通知了。

    observer$:Observer<number>;
    
    observable:Observable<number> = Observable.create(observer => {
      this.observer$ = observer;
    }).share();
    
    xhr.upload.onprogress = (event) => {
      this._progress = Math.round(event.loaded / event.total * 100);
      this.observer$.next(this._progress/100);
    };
    

    对于主题,情况已经如此(热并结合可观察/观察者)。请注意,您应该使用next 而不是onNext

    xhr.upload.onprogress = (event) => {
      this._progress = Math.round(event.loaded / event.total * 100);
      this._subject.next(this._progress/100);
    };
    

    【讨论】:

    • Tks 蒂埃里。有点不知所措。在github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/… 上,它没有列出下一个方法,而只列出了onNext?另一个问题是为什么在一个观察者上调用函数可以通知其他观察者?不应该是通知订阅者的 observable 吗?
    • 谢谢!我一直在到处寻找如何向观察者发送值(将其视为主题)。现在这是有道理的。
    猜你喜欢
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多