使用RxJs Observables - 为什么在数据发生变化时通知用户?

时间:2017-08-17 22:54:46

标签: javascript typescript rxjs

https://plnkr.co/edit/Rfmcrn9Ef3ABiVGDEZSi?p=preview

在这个简单的例子中,我设置了一个observable和一个订阅者。当我将一个新项目(“拉布拉多猎犬”)推送到数组时,我希望通知订阅者..不是这样的..

我在这里缺少什么?

const dogBreeds = ['hound', 'dachshund', 'Pekingnese', 'Pug', 'Mastiff'];

setTimeout(() => {
  dogBreeds.push('Labrador Retriever'); 
}, 1000); 

  const dogBreedObservable = Rx.Observable.from(dogBreeds);

  const dogBreedSubscriber = dogBreedObservable
        .subscribe(
      onNext,
      function onError(err) {
        console.log('Error: ' + err);
      },
      function onCompleted() {
        console.log('no more breeds!');
      }
    );

  function onNext(breed) {
   console.log('breed: ' + breed);
   console.log(dogBreeds);
  }

1 个答案:

答案 0 :(得分:0)

您已经创建了一个dogBreeds的流,就像您还没有添加任何值一样。对dogBreeds的后续更改不会发出,因为您从未告诉过它。

你应该做的是创建一个主题。由于您需要起始值,因此您可能对BehaviorSubject感兴趣。您需要做的是发出一个新值,因此对于您的演示,您可能会执行以下操作。

setTimeout(() => {
  this.dogBreeds = [...this.dogBreeds, 'new', 'breed']
  dogBreedObservable.next(this.dogBreeds)
}, 10)

但是,如果您只想以更类似RxJS的方式进行,您应该考虑使用[scan]之类的运算符 (http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-scan)保持您想要添加的每个新品种的所有品种的累积值。