检查对象是否是RxJS5可观察对象

18 javascript rxjs rxjs5

我有这个方法:

Queue.prototype.drain = function (obs, opts) {};
Run Code Online (Sandbox Code Playgroud)

在方法中,我想检查用户是否传入了第一个参数的observable,或者是否省略了observable并且只是传入了一个options对象.

所以基本上我需要做这样的事情:

if(!Rx.Observable.isObservable(obs)){  //this method is fictitious
    opts = obs || {};
    obs = Rx.Observable.interval(1000);
}
Run Code Online (Sandbox Code Playgroud)

我假设RxJS为用户提供了这种检查,但我找不到向您展示如何进行此类型检查的文档.

谁知道怎么样?

car*_*ant 31

自写这个答案以来,RxJS版本6已经发布,在该版本中,一个isObservable函数被添加到公共API中.它可以像这样导入:

import { isObservable } from "rxjs";
Run Code Online (Sandbox Code Playgroud)

功能签名是:

export function isObservable<T>(obj: any): obj is Observable<T> 
Run Code Online (Sandbox Code Playgroud)

由于它是使用typeguard定义的,编译器可以像这样帮助你:

const result: any = ...;

if (isObservable(result)) 
{
   result.pipe(...);   // compiler now knows it's an observable.
}
Run Code Online (Sandbox Code Playgroud)

在内部,RxJS测试Observable 使用instanceof:

if (result instanceof Observable) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

所以你可以使用:

if (!(obs instanceof Rx.Observable)) {
  opts = obs || {};
  obs = Rx.Observable.interval(1000);
}
Run Code Online (Sandbox Code Playgroud)

instanceof可用于确定对象是否是Observable您正在使用的RxJS库中的对象.

要确定对象是否为外部可观察对象,您可以查找Symbol.observable属性.

如果属性存在且是函数,则可以Observable通过将调用对象Symbol.observable属性返回的值传递给外部可观察对象来获取RxJS Rx.Observable.from.

  • if(isObservable(obj)){console.log("observable")} (2认同)