BehaviorSubject vs Observable?

我正在研究Angular RxJs模式,我不明白BehaviorSubjectObservable之间的区别。

根据我的理解, BehaviorSubject是一个随时间变化的值(可以订阅并且订阅者可以收到更新的结果)。 这似乎与Observable完全相同。

你什么时候使用Observable vs BehaviorSubject ? 通过Observable使用BehaviorSubject是否有好处,反之亦然?


BehaviorSubject是一种主体,主体是一种特殊的可观察类型,因此您可以像其他可观察的一样订阅消息。 BehaviorSubject的独特功能是:

  • 它需要一个初始值,因为它必须始终返回一个订阅值,即使它没有收到next()
  • 订阅后,它返回主题的最后一个值。 常规observable只在收到onnext时触发
  • 在任何时候,您都可以使用getValue()方法检索不可观察代码中主题的最后一个值。
  • 与可观察对象相比,主题的独特特征是:

  • 除了作为观察对象外,它还是一个观察者,所以除了订阅它之外,您还可以将值发送给主题。
  • 此外,您可以使用BehaviorSubject上的asobservable()方法从行为主题中获得可观察值。

    Observable是Generic,而BehaviorSubject在技术上是Observable的子类型,因为BehaviorSubject是具有特定属性的可观察对象。

    BehaviorSubject示例:

    // Behavior Subject
    
    // a is an initial value. if there is a subscription 
    // after this, it would get "a" value immediately
    let bSubject = new BehaviorSubject("a"); 
    
    bSubject.next("b");
    
    bSubject.subscribe((value) => {
      console.log("Subscription got", value); // Subscription got b, 
                                              // ^ This would not happen 
                                              // for a generic observable 
                                              // or generic subject by default
    });
    
    bSubject.next("c"); // Subscription got c
    bSubject.next("d"); // Subscription got d
    

    例2与常规主题:

    // Regular Subject
    
    let subject = new Subject(); 
    
    subject.next("b");
    
    subject.subscribe((value) => {
      console.log("Subscription got", value); // Subscription wont get 
                                              // anything at this point
    });
    
    subject.next("c"); // Subscription got c
    subject.next("d"); // Subscription got d
    

    可以使用subject.asobservable()从Subject和BehaviorSubject创建observable。 唯一的区别是你不能使用next()方法将值发送给observable。

    在Angular服务中,我将使用BehaviorSubject作为数据服务,因为角色服务通常在组件和行为主体进行初始化之前确保使用服务的组件接收最后更新的数据,即使组件订阅了此数据后没有新的更新。


    可观察:每个观察者的结果不同

    一个非常非常重要的区别。 由于Observable只是一个函数,它没有任何状态,因此对于每个新的Observer,它都会一次又一次地执行可观察的创建代码。 这导致:

    代码针对每个观察者运行。 如果它是一个HTTP调用,它会被每个观察者调用

    这会导致重大错误和低效率

    BehaviorSubject(或Subject)存储观察者详细信息,仅运行一次代码并将结果提供给所有观察者。

    例如:

    JSBin:http://jsbin.com/qowulet/edit?js,console

    // --- Observable ---
    let randomNumGenerator1 = Rx.Observable.create(observer => {
       observer.next(Math.random());
    });
    
    let observer1 = randomNumGenerator1
          .subscribe(num => console.log('observer 1: '+ num));
    
    let observer2 = randomNumGenerator1
          .subscribe(num => console.log('observer 2: '+ num));
    
    
    // ------ BehaviorSubject/ Subject
    
    let randomNumGenerator2 = new Rx.BehaviorSubject(0);
    randomNumGenerator2.next(Math.random());
    
    let observer1Subject = randomNumGenerator2
          .subscribe(num=> console.log('observer subject 1: '+ num));
          
    let observer2Subject = randomNumGenerator2
          .subscribe(num=> console.log('observer subject 2: '+ num));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.3/Rx.min.js"></script>

    Observable对象表示一个基于推送的集合。

    Observer和Observable接口为基于推送的通知提供了一种广义机制,也称为观察者设计模式。 Observable对象表示发送通知的对象(提供者); Observer对象表示接收它们的类(观察者)。

    Subject类继承Observable和Observer,它既是观察者又是观察者。 您可以使用主题订阅所有观察者,然后将主题订阅到后端数据源

    var subject = new Rx.Subject();
    
    var subscription = subject.subscribe(
        function (x) { console.log('onNext: ' + x); },
        function (e) { console.log('onError: ' + e.message); },
        function () { console.log('onCompleted'); });
    
    subject.onNext(1);
    // => onNext: 1
    
    subject.onNext(2);
    // => onNext: 2
    
    subject.onCompleted();
    // => onCompleted
    
    subscription.dispose();
    

    更多关于https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md

    链接地址: http://www.djcxy.com/p/55473.html

    上一篇: BehaviorSubject vs Observable?

    下一篇: When would it be beneficial to change an Observable to a promise