[Rx.js] Zip运算符何时发出错误?

时间:2017-05-26 07:31:53

标签: javascript rxjs

我正在学习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时没有解释章节。

任何人都可以帮忙吗?非常感谢。

1 个答案:

答案 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>