2017-06-03 53 views
4

依赖的问题,我有我Angular2组件类的构造函数中以下代码:RxJS与Scheduler.async

var observable = Observable.create(function (observer) { 
     observer.next(1); 
     observer.next(2); 
     observer.next(3); 
     observer.complete(); 
    }).observeOn(Scheduler.async); 

我进口包括以下内容:

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/observeOn'; 
import { Scheduler } from 'rxjs/Scheduler'; 
import 'rxjs/scheduler/async'; 

我尝试以下的进口以及而不是上面的最后一个导入:

import { async } from 'rxjs/scheduler/async'; 

我有以下错误信息:whil e使用Angulat CLI构建我的项目:

Property 'async' does not exist on type 'typeof Scheduler' 

我错过了什么?

回答

5

是的,这是正确的,因为:

import { Scheduler } from 'rxjs/Scheduler'; 

这意味着,您导入这个类:https://github.com/ReactiveX/rxjs/blob/5.4.0/src/Scheduler.ts#L8-L63

import { async } from 'rxjs/scheduler/async'; 

https://github.com/ReactiveX/rxjs/blob/5.4.0/src/scheduler/async.ts#L47

所以你可以看到,Scheduler没有async财产,我想你想转换这个事情Rx.Scheduler.asyncsource code here,你可以试试这个解决方案:

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/observeOn'; 

import { async } from 'rxjs/scheduler/async'; 

var observable = Observable.create(function (observer) { 
     observer.next(1); 
     observer.next(2); 
     observer.next(3); 
     observer.complete(); 
    }).observeOn(async); 
+0

什么是真正的Rx.Scheduler.async,Scheduler.async和异步的区别? – coder

+0

https://github.com/ReactiveX/rxjs/blob/5.4.0/src/Rx.ts#L180-L198'Rx.Scheduler'是一个包含'async'之类的对象,指的是'rxjs/scheduler/async' –

+0

注意'rxjs/Scheduler'和'rxjs/scheduler/async'之间的区别! IntelliJ不会抱怨'rxjs/Scheduler/async'并且给了我与OP相同的错误 – adamdport

6

我认为这值得深入一点解释。

如果你写的只是:

import { Scheduler } from 'rxjs/Scheduler'; 

要导入只是Scheduler类,你可能永远都不想单独使用。这是非常有用导入此只为正确的类型检查,所以你可以有例如:

import { Scheduler } from 'rxjs/Scheduler'; 

class MyClass { 
    sched: Scheduler; 
} 

但是进口只async要导入的already existing instance of an AsyncScheduler class。这用作单例模式,因为通常不需要有多个AsyncScheduler实例。

import { async } from 'rxjs/scheduler/async'; 

现在可以例如检查什么是这个特殊的调度当前时间:

async.now(); 

其实从rxjs/scheduler/async进口是一样的使用Scheduler从刚刚rxjs这实际上是Rx.ts进口:

import { Scheduler } from 'rxjs'; 

... 

Scheduler.async.now(); 

你可以看到有更多不同的调度程序已经准备好:https://github.com/ReactiveX/rxjs/blob/master/src/Rx.ts#L193-L198

什么困惑这里就是利用'rxjs/scheduler/async'asyncScheduler.async'rxjs'之间的差异。 The async from Rx.ts just imports the same 'rxjs/scheduler/async'但由于您正在导入rxjs您还包括Rx.ts中定义的所有依赖关系。这意味着你要导入所有的操作符,这些操作符是你可能不需要的很多文件。

这就是为什么最好只从'rxjs/scheduler/async'导入并没有'rxjs'

import { async } from 'rxjs/scheduler/async'