2017-04-19 84 views
0

我遇到了RxJS这种无法解释的行为,我似乎无法理解为什么。我有以下一段代码。在同一观察者上订阅后,RxJs捕获无效

console.clear(); 
var rx = Rx.Observable; 

var o = rx.throw(['error']); 
var o2 = o.catch(x => rx.of(5)); 
// o.subscribe(x => console.log("1" + x)); 
o2.subscribe(x => console.log("2:" + x)); 

JsBin链接:https://jsbin.com/hikopob/edit?html,js,console

当我运行上面的代码,它打印2:5这正是我所期望的。不过,如果我取消注释注释行,我看到下面的控制台:

“错误”

“未捕获错误(10号线)”

我没有看到2:5再次在控制台上打印。我不明白的是,subscribe()处理程序如何影响下一个?我的catch()处理程序发生了什么?为什么完全忽略o2.subscribe()?

回答

0

当您取消注释o.subscribeo发出错误通知,对此您有没有处理程序(你只设置onNext处理),所以这就是为什么你得到Uncaught error (line 10)消息。因此,在程序退出之前甚至达到o2.subscribe(x => console.log("2:" + x));

如果你试试这个,你会看到其中的差别:

console.clear(); 
var rx = Rx.Observable; 

var o = rx.throw(['error']); 
var o2 = o.catch(x => rx.of(5)); 
o.subscribe(x => console.log("1" + x), x => console.log("error:" + x)); 
o2.subscribe(x => console.log("2:" + x)); 
+0

感谢。这回答了这个问题。 –

0
var o = rx.throw(['error']); 
o.subscribe(x => console.log("1" + x)); 

o是您正在使用其rxjs函数序列订阅的可观察项。 o本身在订阅时没有捕获

var o2 = o.catch(x => rx.of(5)); 

在这里,您已经添加了产量和分配新的可观测到o2

所以只有o2catch()函数而不是o

我不明白的是,subscribe()处理程序如何影响下一个?

不是。问题与解释一样,o observable在订阅时没有catch()。