【问题标题】: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 为用户提供了这种检查,但我找不到向您展示如何进行这种类型检查的文档。

有人知道怎么做吗?

【问题讨论】:

    标签: javascript rxjs rxjs5


    【解决方案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 &amp;&amp; 可能没必要,obj &amp;&amp; 就可以了
    • 此页面上唯一的!! 在您的评论中。
    【解决方案2】:

    似乎检查对象中的key属性仍然是一种检查它是否可观察的方法。

    这里是an example used in the Nest.js Framework

    虽然,目前官方 rxjs 项目中确实有 a type guard-like util function defined。它似乎仍在内部使用,因为我目前没有看到此函数直接导出到主索引中。

    【讨论】:

      猜你喜欢
      • 2010-12-23
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 2021-02-03
      • 1970-01-01
      • 2012-05-02
      相关资源
      最近更新 更多