我正在学习Rx.js并且zip
运算符存在一个问题:
var error =Rx.Observable.throw('Oop!');
var age$ = Rx.Observable.concat(Rx.Observable.of(21,22,23),error);
var sex$ = Rx.Observable.of("male","male","female","female");
var name$ = Rx.Observable.of("jack","john","james","lucy");
var example = Rx.Observable.zip(age$,sex$,name$,(age,sex,name)=>{ return {age,sex,name} });
我订阅了example
来源并打印了一些消息:
example.subscribe({
next: (value) => { console.log(value); },
error: (err) => { console.log('Error: ' + err); },
complete: () => { console.log('complete'); }
});
输出不是我的预期:
{age:21,sex:"male",name:"jack"}
{age:22,sex:"male",name:"john"}
{age:23,sex:"female",name:"james"}
error
但只有一行with no value output
:
error
阅读offical doc,但zip
运算符发出error
时没有解释章节。
任何人都可以帮忙吗?非常感谢。
答案 0 :(得分:4)
您会立即看到错误,因为您传递的第一个observable会同步发出其值。 (其他可观察量也同步发出它们的值,但在这种情况下无关紧要。)
zip
按照传递的顺序逐个订阅传递的observable。在订阅第一个observable时,zip
同步接收所有可观察的值和连接的错误。然后它会发出自己的错误并完成。
如果指定可选的scheduler参数 - 以便observables异步发出它们的值 - 您将看到您期望的行为:
var age$ = Rx.Observable.concat(
Rx.Observable.of(21, 22, 23, Rx.Scheduler.async),
Rx.Observable.throw("Oop!", Rx.Scheduler.async)
);
var sex$ = Rx.Observable.of(
"male", "male", "female", "female",
Rx.Scheduler.async
);
var name$ = Rx.Observable.of(
"jack", "john", "james", "lucy",
Rx.Scheduler.async
);
var zipped$ = Rx.Observable.zip(
age$, sex$, name$,
(age, sex, name) => ({ age, sex, name })
);
zipped$.subscribe(
(value) => console.log(value),
(error) => console.log(error),
() => console.log("complete")
);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>