2017-06-03 46 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'