执行一个 Observable
在 Observable.create(function subscribe(observer) {...}) 中省略的代码, 代表一个 Observable execution;Observable execution 是延迟计算的, 只有当一个 Observable 对象被订阅的时候 Observable execution 才会被计算运行. Observable execution 会同步或者异步的产生许多值.
Observable execution 可以产生三种类型的通知:
Next 类型的通知: 发送 Number,String,Object 等类型的值.
Error 类型的通知: 发送 JavaScript 的异常或者错误.
Complete 类型的通知: 不发送任何值.
Next 类型的通知是最重要和最常用的, 这种类型的通知把数据传递给相应的 Observer;Error 和 Complete 这两种类型的通知 在 Observable execution 的执行过程中, 只会发送一种; 要么是 Error 类型, 要么是 Complete 类型; 并且只会发送一次. 因为一旦 Error 或者 Complete 类型的通知发送完毕, 整个 Observable execution 就结束了.
这三种通知的关系, 我们可以使用 Observable 风格的约定来表示, 表示如下:
next*(error|complete)?
我们接下来使用代码来实践一下上面所说的内容:
- const observable = Observable.create(function subscribe(observer) {
- observer.next(1);
- observer.next(2);
- observer.complete();
- observer.next(3) // 3 不会被打印出来
- });
- observable.subscribe(val => {
- console.log(val);
- });
上面代码的运行结果如下所示:
1
2
这表明了, 在 Observable execution 在发出一个 Complete 通知后, 整个 Observable execution 执行结束, 后面的代码不会再执行了.
接下来我们来通过 Observable execution 发送一个 Error 通知, 代码如下所示:
- const observable = Observable.create(function subscribe(observer) {
- observer.next(1);
- observer.next(2);
- observer.error(0);
- observer.next(3) // 3 不会被打印出来
- });
- observable.subscribe(val => {
- console.log(val);
- });
代码的运行结果如下所示:
- 1
- 2
- Uncaught 0 // 这一行在控制台显示为红色
从上面的结果我们可以看出, 当一个 Observable execution 发出一个 Error 通知之后, 整个 Observable execution 执行结束, 接下来的代码也就不会执行了. 但是控制台抛出了一个错误 Uncaught 0, 这是因为我们没有捕获这个错误, 所以控制台就抛出了这个错误. 关于这部分我们在下面的文章中有详细的说明.
最佳实践: 我们可以使用 try/catch 来包裹我们 Observable execution 里面的代码; 这样一来当我们的代码抛出错误的时候, 就会发送一个 Error 类型的通知, 我们就可以及时地捕获到这个错误, 方便我们下一步的处理.
来源: https://juejin.im/entry/5c1702e26fb9a049ee805bc4