首页 > JavaScript > 在JavaScript 中BehaviorSubject vs Observable区别?

在JavaScript 中BehaviorSubject vs Observable区别?

上一篇 下一篇

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

根据我的理解,a 是一个可以随时间变化的值(可以订阅,订阅者可以接收更新的结果)。这似乎与 .BehaviorSubjectObservable

你什么时候会使用 vs a ?使用超过或反之亦然有什么好处吗?ObservableBehaviorSubjectBehaviorSubjectObservable

分割线

网友回答:

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

  • 它需要一个初始值,因为它必须始终在订阅时返回一个值,即使它没有收到next()
  • 订阅后,它返回主题的最后一个值。常规可观察量仅在收到onnext
  • 在任何时候,都可以使用该方法在不可观察的代码中检索主题的最后一个值。getValue()

与可观察量相比,主体的独特特征是:

  • 它除了是可观察对象之外,还是观察者,因此除了订阅主题之外,您还可以向主题发送值。

此外,您可以使用 上的方法从行为主体获取可观察量。asObservable()BehaviorSubject

Observable 是泛型的,从技术上讲是 Observable 的子类型,因为 BehaviorSubject 是具有特定品质的 ObservableBehaviorSubject

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 won't get 
                                          // anything at this point
});

subject.next("c"); // Subscription got c
subject.next("d"); // Subscription got d

可以从两者创建可观察量,也可以使用 创建可观察量。SubjectBehaviorSubjectsubject.asObservable()

唯一的区别是您无法将值发送到可观察的 using 方法。next()

在 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>

输出:

"observer 1: 0.7184075243594013"
"observer 2: 0.41271850211336103"
"observer subject 1: 0.8034263165479893"
"observer subject 2: 0.8034263165479893"

观察如何使用为每个观察器创建不同的输出,但为所有观察器提供相同的输出。这很重要。Observable.createBehaviorSubject


总结了其他差异。

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃         Observable                  ┃     BehaviorSubject/Subject         ┃      
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ 
┃ Is just a function, no state        ┃ Has state. Stores data in memory    ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Code run for each observer          ┃ Same code run                       ┃
┃                                     ┃ only once for all observers         ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Creates only Observable             ┃Can create and also listen Observable┃
┃ ( data producer alone )             ┃ ( data producer and consumer )      ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Usage: Simple Observable with only  ┃ Usage:                              ┃
┃ one Obeserver.                      ┃ * Store data and modify frequently  ┃
┃                                     ┃ * Multiple observers listen to data ┃
┃                                     ┃ * Proxy between Observable  and     ┃
┃                                     ┃   Observer                          ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

分割线

网友回答:

观察和主体都是可观察的,这意味着观察者可以跟踪它们。它们都有一些独特的特征。有3种类型的主题,每种主题也有独特的特征。

您可以在堆栈闪电战中找到实际示例。
(您需要检查控制台才能看到实际输出)

Observables

他们很冷:当代码至少有一个观察者时,代码就会被执行。

创建数据副本:可观察为每个观察者创建数据副本。

单向:观察者不能将值分配给可观察对象(原点/主节点)。

Subject

它们很热:即使没有观察者,代码也会被执行,值也会被广播。

分享数据:相同的数据在所有观察者之间共享。

双向:观察者可以将值分配给可观察对象(原点/主节点)。

如果您使用的是主题,那么您会错过在创建观察器之前广播的所有值。所以来了重播主题

ReplaySubject

它们很热:即使没有观察者,代码也会被执行,值也会被广播。

分享数据:相同的数据在所有观察者之间共享。

双向:观察者可以将值分配给可观察对象(原点/主节点)。加

重播消息流:无论您何时订阅重播主题,您都将收到所有广播消息。

在“主题”和“重播主题”中,不能将初始值设置为可观察。所以来了行为主体

BehaviorSubject

它们很热:即使没有观察者,代码也会被执行,值也会被广播。

分享数据:相同的数据在所有观察者之间共享。

双向:观察者可以将值分配给可观察对象(原点/主节点)。加

重播消息流:无论您何时订阅重播主题,您都将收到所有广播消息。

您可以设置初始值:您可以使用默认值初始化可观察量。

模板简介:该模板名称为【在JavaScript 中BehaviorSubject vs Observable区别?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 267次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 04-22
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信模板 微信公众平台 微信素材 html5 自适应 微信文章 企业网站 响应式 微信图片 单页式简历模板
您可能会喜欢的其他模板