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<any[])>
的主要区别是什么?
一个是数组,另一个是数组的可观察(流)。
使用它们各自的优缺点是什么?
利弊是,如果你想要一个数组,你应该使用一个数组。如果你想要一个可观察的数组,那么你应该使用一个可观察的数组。
请注意,尽管您的问题涉及 TypeScript,但数组和可观察对象(包括数组的可观察对象)的概念本质上与语言无关。
【讨论】:
4 票否决?什么?我不确定这个答案是否好,因为这个问题很可怕,但肯定没那么糟糕。 @Bergi 否决票来自较早的、刻薄的答案版本,请参阅编辑历史记录。 @torazaburo 感谢您的回答。 @user663031 以前的版本有什么奇怪的地方? AFAICT 在打字稿中没有Observable<T>
这样的东西。您指的是某个 3rd 方库吗?以上是关于Array 和 Observable Array 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Observable<Array<any>> 中删除特定元素
Angular5:TypeError:您在预期流的位置提供了“未定义”。您可以提供 Observable、Promise、Array 或 Iterable