天天看点

rxjs of操作符生成的Observable对象的执行详细分析

rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析
rxjs of操作符生成的Observable对象的执行详细分析

import { config } from './config';

import { hostReportError } from './util/hostReportError';

export const empty = {

   closed: true,

   next(value) { },

   error(err) {

       if (config.useDeprecatedSynchronousErrorHandling) {

           throw err;

       }

       else {

           hostReportError(err);

   },

   complete() { }

};

//# sourceMappingURL=Observer.js.map

ExtensibilityExtensibility

![](https://img-blog.csdnimg.cn/img_convert/fd30a74f127e31a732add12cbcbabc05.png)

所以toSubscriber返回的实际是一个subscriber对象:

![](https://img-blog.csdnimg.cn/img_convert/d755db210f9042167caa4c3f8e51fbae.png)

![](https://img-blog.csdnimg.cn/img_convert/d7a08902cbd7f7c2cf54a7e8e440be08.png)

首先调用subscriber对象的add方法,目的是通过这个三元表达式,判断到底应该调用subscribe方法,还是trySubscribe方法:

![](https://img-blog.csdnimg.cn/img_convert/7842df68ea5df9dff9665ee002a0e0bc.png)

在我的Angular10,执行后者:

![](https://img-blog.csdnimg.cn/img_convert/fc35352eb8125afd3f4cb34c2b936136.png)

记住这个语义:Observable的subscribe方法,输入参数为subscriber:

![](https://img-blog.csdnimg.cn/img_convert/39930d88fe8b1b7febc9db45584dd876.png)

_trySubscribe调用_subscribe:

![](https://img-blog.csdnimg.cn/img_convert/c8255b7f4b351bcc80ad7d008b684cf8.png)

然后就执行到了之前用subscribeToArray返回的function内部:

![](https://img-blog.csdnimg.cn/img_convert/cca17064851f45b8998808a521e16e92.png)

注意在这个上下文里,我们既有输入,又有应用程序传入的subscribe函数,因此可以调用next了:

![](https://img-blog.csdnimg.cn/img_convert/00b5a512ad77740193ee1d209d188051.png)

![](https://img-blog.csdnimg.cn/img_convert/d6a9930cec4e5d881e6b3a104bda7da3.png)

next和_next的区别就在于有个this.isStopped的判断:

![](https://img-blog.csdnimg.cn/img_convert/4368c8a5e31f1c595616f2b666383b46.png)

注意语义:Observable调用subscribe,而subscriber调用next.

![](https://img-blog.csdnimg.cn/img_convert/ed88af507bbecd6b570cdb7dbd887e6f.png)

subscriber的desination里包含了应用程序传入的callback:

![](https://img-blog.csdnimg.cn/img_convert/831d2d80553d2ee5723196289f8446a5.png)

![](https://img-blog.csdnimg.cn/img_convert/7934c01b71638f69ce2595b6ed3a976f.png)

subscriber的_tryOrUnsub函数里,最终调用应用程序的callback:

![](https://img-blog.csdnimg.cn/img_convert/4309fcce0db382818f54641af6e04d75.png)

![](https://img-blog.csdnimg.cn/img_convert/f3c9f2197cb9c5812245324c029aee24.png)

继续阅读