MobX Observables与RxJS有关系吗?

时间:2018-12-10 14:36:00

标签: javascript angular reactjs rxjs mobx

标题几乎是自我解释的。我找不到有关它的任何信息。 Angular在引擎盖下使用RxJs可观察到的东西在React和MobX中尤其如此吗?

2 个答案:

答案 0 :(得分:2)

根据我在MobX源代码中看到的内容,没有很多重叠。他们两个都不互相使用,或者彼此之间有共同的依赖关系。

MobX中Observable的解释似乎是对象,数组,地图等被Proxy对象包装,以跟踪和通知属性更改。这用于通过应用程序传达状态更改,而对原始javascript类型的更改相对较少(这可能是“透明”的含义)。尽管这些类型是可以观察到的(如动词中所示),但它们不是Observables defined by ReactiveX的实现。

另一方面,

RxJS提供了一个全新的,有人会说是巨大的API,该API用于修改由抽象Observable类型(不一定代表原始javascript类型)生成的所谓“通知”。不是强制性地直接更改对象,而是使用由可管道运算符组成的“ LINQ-ish”语言来表示执行流。在许多方面,RxJS可以看作是JavaScript的语言扩展,以启用响应式编程as defined in the Observable contract

但是有一个重叠之处,那就是“ MobX”是一个用于以下用途的库

  

透明地应用函数式反应式编程

RxJS也提供了反应式编程,但是绝对不透明。

答案 1 :(得分:0)

这是来自官方mobx github wiki page

的一个易于理解的示例

让我们假设您有一个带有三个属性的人对象(MobX中的可观察属性或RxJs中的流):

class Person {
  constructor(firstname, lastname, nickname) {
    this.firstname = firstname
    this.lastname = lastname
    this.nickname = nickname
  }
}

让我们假设您想被动地为该人派生一个“显示名”。你想要这样的东西...

displayname() {
   return this.nickname ? this.nickname : this.firstname + ' ' + this.lastname
}

在MobX中,您需要的是:-

const displayname = computed(() => this.nickname ? this.nickname : this.firstname + ' ' + this.lastname)

但是,在RxJS中,您必须执行以下操作:-

const displayStream = person.nickname.combineLatest(this.nickname, this.firstname, this.lastname)
  .map([nickname, firstname, lastname] => nickname ? nickname : firstname + " " + lastname)
  .distinctUntilChanged

如以上示例所示,这是链接的阅读内容的重点:-

  1. 在MobX中,您几乎没有运算符,因为通常通过普通的javascript构造将内容组合在一起。
  2. 在RxJS中,您需要使用CombineLatest或任何其他运算符来执行此操作。
  3. MobX将自动停止侦听未积极使用的可观察对象。
  4. MobX具有一流的支持,可以有效地处理复杂的数据结构,例如对象,数组和地图。

何时在另一个上使用?

“如果时间起着重要的作用,例如在节流,累积事件或具有诸如zip之类的复杂联接模式时,这些都是您要使用流(RxJS)的情况,否则您可以简单地使用MobX。

有关详细说明,请转到MobX Repo