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

Kai*_*cui 5 javascript rxjs

我正在学习Rx.jszip操作员有一个问题:

    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} });
Run Code Online (Sandbox Code Playgroud)

我订阅了example源并打印了一些消息:

    example.subscribe({
        next: (value) => { console.log(value); },
        error: (err) => { console.log('Error: ' + err); },
        complete: () => { console.log('complete'); }
    });
Run Code Online (Sandbox Code Playgroud)

输出不是我期望的:

{age:21,sex:"male",name:"jack"}
{age:22,sex:"male",name:"john"}
{age:23,sex:"female",name:"james"}
error
Run Code Online (Sandbox Code Playgroud)

但只有一行with no value output

    error
Run Code Online (Sandbox Code Playgroud)

阅读官方文档,但在zip操作人员退出时没有解释任何章节error

任何人都可以帮忙吗?

car*_*ant 5

您会立即看到错误,因为您传递的第一个 observable 同步发出其值。(其他 observable 也同步发出它们的值,但这在这种情况下无关紧要。)

zip一一订阅传递的 observables 并按照它们传递的顺序。在订阅第一个 observable 时,zip同步接收所有 observable 的值和串联错误。然后它发出自己的错误并完成。

如果您指定可选的调度程序参数 - 以便 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")
);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>
Run Code Online (Sandbox Code Playgroud)