检查对象是不是为 Observable
Posted
技术标签:
【中文标题】检查对象是不是为 Observable【英文标题】:Check if object is an Observable检查对象是否为 Observable 【发布时间】:2017-05-18 01:22:01 【问题描述】:我正在使用 RxJS 5 并且有这个方法:
Queue.prototype.drain = function (obs, opts) ;
在该方法中,我想检查用户是否为第一个参数传入了Observable
,或者他们是否省略了Observable
,而只是传入了一个选项对象。
所以基本上我需要做这样的事情:
if(!Rx.Observable.isObservable(obs)) //this method is fictitious
opts = obs || ;
obs = Rx.Observable.interval(1000);
我假设 RxJS 为用户提供了这种检查,但我找不到向您展示如何进行这种类型检查的文档。
有人知道怎么做吗?
【问题讨论】:
【参考方案1】:自编写此答案以来,RxJS 版本 6 已经发布,并且在该版本中,isObservable
函数已添加到公共 API。可以这样导入:
import isObservable from "rxjs";
函数签名是:
export function isObservable<T>(obj: any): obj is Observable<T>
由于它是使用类型保护定义的,因此编译器可以像这样帮助您:
const result: any = ...;
if (isObservable(result))
result.pipe(...); // compiler now knows it's an observable.
在内部,RxJS 测试 Observable
using instanceof
:
if (result instanceof Observable)
...
所以你可以使用:
if (!(obs instanceof Rx.Observable))
opts = obs || ;
obs = Rx.Observable.interval(1000);
instanceof
可用于确定一个对象是否是您正在使用的 RxJS 库中的 Observable
。
要判断对象是否为外来可观察对象,可以look for a Symbol.observable
property。
如果该属性存在并且是一个函数,则可以通过将调用对象的Symbol.observable
属性返回的值传递给Rx.Observable.from
来从外部可观察对象中获取RxJS Observable
。
【讨论】:
if (isObservable(obj)) console.log("observable") 我听说instanceof
运算符在比较跨 iframe 运行的代码时可能会中断,如果构造函数 refs 不完全相同,这是有道理的。我假设isObservable
的实现可以处理这个问题。
!!obj &&
可能没必要,obj &&
就可以了
此页面上唯一的!!
在您的评论中。【参考方案2】:
似乎检查对象中的key属性仍然是一种检查它是否可观察的方法。
这里是an example used in the Nest.js Framework。
虽然,目前官方 rxjs 项目中确实有 a type guard-like util function defined。它似乎仍在内部使用,因为我目前没有看到此函数直接导出到主索引中。
【讨论】:
以上是关于检查对象是不是为 Observable的主要内容,如果未能解决你的问题,请参考以下文章