2017-10-20 87 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完成。有没有“第一次发射超时”? –