Array 和 Observable Array 有啥区别?

Posted

技术标签:

【中文标题】Array 和 Observable Array 有啥区别?【英文标题】:What is the difference between an Array and an Observable Array?Array 和 Observable Array 有什么区别? 【发布时间】:2016-12-03 08:47:57 【问题描述】:

在 TypeScript 中,any[]Observable<any[])> 的主要区别是什么? 使用它们各自的优缺点是什么?

【问题讨论】:

好吧,我认为这与是否观察到数组有关:).Observable Arrays can respond to a change in the number of items in the collection (array) Observable 是以 any[] 为模板的对象,any[] 是任意类型的数组 不要与ObservableArray 混淆。可以说这个问题缺少一个标签,Observable<T> 不是打字稿也不是 javascript 类型。它是某个第 3 方库中的一种类型,可以说这个问题应该有该库的标签。 【参考方案1】:

Observables 用于实现观察者模式。你可以订阅这个 Observable,当 Observable 发出数据时你会得到异步通知。

Observable<any[])Observable 包含一个数组。在这种情况下,数组可以包含任何类型,因为它是由 any 键入的。

数组只是一个对象,一次可以保存多个值。

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

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

Take a look at the rxjs docs

对比

数组是类似列表的对象,其原型具有执行遍历和变异操作的方法。 JavaScript 数组的长度和元素的类型都不是固定的。

MDN - Arrays

【讨论】:

一个数组不是一个“变量”,尽管它可以被赋值给一个。这是一种特殊类型的值。 是的,这个描述有点不准确。我更新了我的答案。 Observable 是 observable 的数组,还是 作为 observable 的数组observable 中的数组【参考方案2】:

要全面了解跨空间和时间的各种类型的值,包括单数和复数,请参阅A General Theory of Reactivity。

数组是一个空间可迭代。换句话说,它是一个可迭代的(事物列表),存在于空间中的某个点,您现在可以并且想要使用它。

一个 observable 是一个时间可迭代。换句话说,它是一个随时间展开的事物列表,您可以逐一消费。

举个具体的例子,让我们来看看如何迭代每种类型的列表:

数组

const array: Array<number> = [1, 2, 3];
array.forEach(elt => console.log(elt));

这是同步的,将立即执行。

可观察

const observable: Observable<number> = Observable.from([1, 2, 3]);
observable.subscribe(elt => console.log(elt));

这是异步的,将在元素进入时一次执行一个元素。

但是,您提出了一个稍微不同的问题,即数组和可观察数组之间的区别(为了清楚起见,我们应该避免将其称为“可观察数组”,因为这可能会被误解为“可观察的数组”,这是另一回事,虽然肯定有用)。

不同之处在于,正如我所提到的,数组只是单个时间点的单个值列表。可观察的数组是数组的,每个“滴答”都会产生一个完整的、新的、不同的数组。

因此,如果您只想要一个项目列表,请使用数组。当然,您可以改变或转换数组,但这并不会改变在任何给定时间点只有一个数组这一事实。

如果您打算继续获取数组的新版本(在不同时间点的不同版本)并且您希望将每个新版本“推送”到程序的不同部分,请使用可观察的数组,这在 observable 术语中,将“订阅” observable,并在每次更新时收到通知。

那么回答你的问题:

any[]Observable&lt;any[])&gt; 的主要区别是什么?

一个是数组,另一个是数组的可观察(流)。

使用它们各自的优缺点是什么?

利弊是,如果你想要一个数组,你应该使用一个数组。如果你想要一个可观察的数组,那么你应该使用一个可观察的数组。

请注意,尽管您的问题涉及 TypeScript,但数组和可观察对象(包括数组的可观察对象)的概念本质上与语言无关。

【讨论】:

4 票否决?什么?我不确定这个答案是否好,因为这个问题很可怕,但肯定没那么糟糕。 @Bergi 否决票来自较早的、刻薄的答案版本,请参阅编辑历史记录。 @torazaburo 感谢您的回答。 @user663031 以前的版本有什么奇怪的地方? AFAICT 在打字稿中没有 Observable&lt;T&gt; 这样的东西。您指的是某个 3rd 方库吗?

以上是关于Array 和 Observable Array 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Observable<Array<any>> 中删除特定元素

如何从 Observable Array 嵌套对象中获取值

将Observable的输出从Object转换为Array

Angular5:TypeError:您在预期流的位置提供了“未定义”。您可以提供 Observable、Promise、Array 或 Iterable

Observable 的转换

mobx中的数组需要注意的地方