MobX Observables 与 RxJS 有什么关系吗?
Does MobX Observables have anything to do with RxJS ones?
标题几乎不言自明。我找不到任何关于它的信息。 Angular 在幕后使用 RxJs observables 在 React 和 MobX 中是否是一样的?
从我在 MobX 源代码中看到的,没有太多重叠。它们既不相互使用也不具有共同的依赖关系。
在 MobX 中对 Observable 的解释似乎是对象、数组、映射等被 Proxy 对象包裹起来以跟踪并在 属性 变化时得到通知。这用于通过应用程序传达状态更改,同时对香草 javascript 类型的更改相对较少(这可能是他们所说的 "transparent" 的意思)。虽然这些类型可能是可观察的(如在动词中),但它们不是 Observables defined by ReactiveX.
的实现
RxJS 另一方面,提供了一个全新的,有些人会说巨大的,API 用于修改所谓的 "notifications" 生成的抽象 Observable 类型,不一定表示香草 javascript 类型。不是直接强制更改对象,而是使用由可管道运算符组成的 "LINQ-ish" 语言来表达执行流程。在许多方面,RxJS 可以被视为 JavaScript 的语言扩展,以启用 Reactive 编程 as defined in the Observable contract。
虽然有一个重叠,那就是 "MobX" 声称是一个用于
的库
transparently applying functional reactive programming
RxJS 也提供响应式编程,但它绝对不是透明的。
这里是mobx官方的一个简单易懂的例子github wiki page
假设您有一个具有三个属性(MobX 中的可观察属性或 RxJs 中的流)的 person 对象:
class Person {
constructor(firstname, lastname, nickname) {
this.firstname = firstname
this.lastname = lastname
this.nickname = nickname
}
}
让我们假设你想为这个人被动地派生一个 'displayname'。你想要这样的东西...
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
如上例所示,这里是链接阅读的要点:-
- 在 MobX 中你几乎没有运算符,因为东西通常是通过正常的 javascript 构造组合起来的。
- 在 RxJS 中,您需要使用 combineLatest 或任何其他运算符来执行此操作。
- MobX 将自动停止侦听未主动使用的可观察对象。
- MobX 首次 class 支持高效处理对象、数组和映射等复杂数据结构。
什么时候用一个代替另一个?
"如果时间起着重要的作用,比如节流、累积事件或具有像 zip 这样的复杂连接模式,这些都是你想要使用流 (RxJS) 的情况,否则你可以简单地使用 MobX。"
如需更详细的解释,请前往 MobX Repo
标题几乎不言自明。我找不到任何关于它的信息。 Angular 在幕后使用 RxJs observables 在 React 和 MobX 中是否是一样的?
从我在 MobX 源代码中看到的,没有太多重叠。它们既不相互使用也不具有共同的依赖关系。
在 MobX 中对 Observable 的解释似乎是对象、数组、映射等被 Proxy 对象包裹起来以跟踪并在 属性 变化时得到通知。这用于通过应用程序传达状态更改,同时对香草 javascript 类型的更改相对较少(这可能是他们所说的 "transparent" 的意思)。虽然这些类型可能是可观察的(如在动词中),但它们不是 Observables defined by ReactiveX.
的实现RxJS 另一方面,提供了一个全新的,有些人会说巨大的,API 用于修改所谓的 "notifications" 生成的抽象 Observable 类型,不一定表示香草 javascript 类型。不是直接强制更改对象,而是使用由可管道运算符组成的 "LINQ-ish" 语言来表达执行流程。在许多方面,RxJS 可以被视为 JavaScript 的语言扩展,以启用 Reactive 编程 as defined in the Observable contract。
虽然有一个重叠,那就是 "MobX" 声称是一个用于
的库transparently applying functional reactive programming
RxJS 也提供响应式编程,但它绝对不是透明的。
这里是mobx官方的一个简单易懂的例子github wiki page
假设您有一个具有三个属性(MobX 中的可观察属性或 RxJs 中的流)的 person 对象:
class Person {
constructor(firstname, lastname, nickname) {
this.firstname = firstname
this.lastname = lastname
this.nickname = nickname
}
}
让我们假设你想为这个人被动地派生一个 'displayname'。你想要这样的东西...
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
如上例所示,这里是链接阅读的要点:-
- 在 MobX 中你几乎没有运算符,因为东西通常是通过正常的 javascript 构造组合起来的。
- 在 RxJS 中,您需要使用 combineLatest 或任何其他运算符来执行此操作。
- MobX 将自动停止侦听未主动使用的可观察对象。
- MobX 首次 class 支持高效处理对象、数组和映射等复杂数据结构。
什么时候用一个代替另一个?
"如果时间起着重要的作用,比如节流、累积事件或具有像 zip 这样的复杂连接模式,这些都是你想要使用流 (RxJS) 的情况,否则你可以简单地使用 MobX。"
如需更详细的解释,请前往 MobX Repo