2017-10-20 117 views
0

好吧,所以現在我真的很困惑。執行以下代碼rxjs創建可觀察的超時總是錯誤

const created = Rx.Observable.create(observer => { 
    observer.next(42) 
}) 
const ofd = Rx.Observable.of(42) 

const createSub = name => [ 
    val => console.log(`${name} received ${val}`), 
    error => console.log(`${name} threw ${error.constructor.name}`) 
] 

created 
    .timeout(100) 
    .subscribe(
    ...createSub('created') 
) 

ofd 
    .timeout(100) 
    .subscribe(
    ...createSub('ofd') 
) 

打印

"created received 42" 
"ofd received 42" 
"created threw TimeoutError" 

我不明白這一點在所有的,爲什麼即使它發出一個值,但ofd可觀察是不是就created可觀測誤差?

使用RxJS 5時,jsbin.com中的5.0.3和我的應用程序中的5.4.3發生問題。

(注:這種情況與科目太,這使我創造這個例子)

+0

你能分享jsbin代碼嗎? – Maxime

+0

http://jsbin.com/fihotoduqo/1/edit?js,console 它與上面的代碼相同,但 –

回答

1

Observable.of是完成價值已發出之後流。

Observable.create保持可觀察的開放。這就是爲什麼timeout發生錯誤。

更換

const created = Rx.Observable.create(observer => { 
    observer.next(42) 
}) 

通過

const created = Rx.Observable.create(observer => { 
    observer.next(42); 
    observer.complete(); 
}) 

而且也沒有錯誤了。

+0

實際上是有意義的......但它不是超時文檔所說的: http:///reactivex.io/documentation/operators/timeout.html 如果發射任何值,那麼不應該拋出該錯誤,或​​者我讀這個錯誤? –

+0

「如果Observable在指定的時間範圍內未能發出任何項目,Timeout運算符允許您放棄具有onError終止的Observable」,則發出一個值,然後出現超時。我猜這是正常行爲 – Maxime

+0

必須讀兩次,所以它的錯誤,因爲在第一個值超時發生後...嗯,我想要的方式是確保observable完成。有沒有「第一次發射超時」? –