与所有HttpClient方法一样,该方法在开发人员对该方法返回的可观察对象调用subscribe()之前不会启动其HTTP请求。这适用于所有HttpClient方法。下图中的loadLanguages是SAPSpartacus前端实现中获取语言列表的方法。其中第28行调用了HTTPClient输入实例http的get方法。这个方法返回一个Observable。在Angular中直接调用loadLanguages是不会触发真正的HTTP请求的。这是因为,从HttpClient方法返回的所有可观察对象在设计上都称为代码可观察对象。HTTP请求的执行被延迟,允许开发人员在HTTP请求实际发生之前使用额外的操作(例如tap和catchError)扩展可观察对象。只有调用subscribe()才会触发可观察对象的执行,并导致HttpClient编写HTTP请求并将其发送到服务器。将这些可观察对象视为实际HTTP请求的蓝图。事实上,每个subscribe()都会启动一个单独的、独立的可观察执行。订阅两次会产生两个HTTP请求。因此,如果我们在SAPSpartacus代码中的第27行代码中使用一个变量来存储loadLanguages返回的Observable,并且订阅这个变量两次,就会触发两次HTTP请求发送到SAPCommerceCloud后台。我们看SAPSpartacus的代码,SiteConnector调用了SiteAdapter的这个方法。然后看哪个方法调用了SiteConnector的getLanguages方法。您可以在VisualStudioCode中使用Ctrl+Tab快捷键来加快文件之间的切换。SAPSpartacus使用NgRx框架进行状态管理。在LanguagesEffects类的实现中,调用了siteConnector的getLanguages。这里代码第26行使用了exhaustMap,这个Operator的作用和switchMap相反。如果请求A已经发送但是还没有被服务器处理,那么再次发送请求B,switchMap会自动取消A请求,发送B请求。如果换成exhaustMap,B请求会被忽略,但A请求不受影响。exhaustMap适用于那些在点击一个按钮后发现页面没有响应时,往往会重复点击同一个按钮的用户。
