即使没有订阅,Observable中的http请求也会发生

时间:2018-11-13 17:31:23

标签: javascript angular ecmascript-6 rxjs6

我看到http请求发生了-在Chrome的“网络”标签中,并且还在获取承诺中使用了$ sudo apt update $ sudo apt install python3.6-venv $ python3.6 -mvenv venv $ source venv/bin/activate -下面的代码,尽管从未订阅内部可观察到的内容(then() )。

我已根据更新的rxjs文档修改为使用saveCourses$而不是from(),但是还是会发生同样的情况。

我的理解是内部Observable不应运行?

fromPromise()

2 个答案:

答案 0 :(得分:2)

尽管基于Observable的接口通常将昂贵的工作(如网络呼叫)推迟到被订阅,但这并不是必须的。有时,返回Observable的方法甚至在调用其subscribe方法之前就已经完成或开始了很多工作。如果Observable在订阅之前就可以正常工作,则通常称为“热”(与“冷”的Observable相对,除非附加了订阅者,否则它不工作)。在此处查看"Hot and Cold Observables"部分。

基于

Promise的界面的工作方式与“热门” Observable相似。也就是说,我们希望一旦调用调用给我们Promise的函数,便会开始执行潜在的昂贵操作。我们了解了解决Promise时的操作结果,但是它将解决我们是否真正在听它(即,将“ then”处理程序连接到Promise)。

在您的示例中,您的Observable是使用fromPromise方法创建的

fromPromise(fetch(`/api/courses/${this.course.id}`...)

fromPromise本质上是通过等待Promise待解决而工作的,当它通过新创建的Observable发出Promise的已解决值时。这里重要的是fromPromise 必须调用fetch()才能获得构建Observable的Promise。调用获取操作导致网络调用被启动。

因此,在这种情况下,但与大多数“典型”的Observables用于网络或其他长时间操作不同,您无需调用.subscribe()即可执行该操作。它会在调用fetch时立即执行,并且在创建时(而不是预订时)调用fetch

答案 1 :(得分:0)

使用fetch停止并使用HttpClient。如果打开控制台并键入fetch('foo'),将看到一个净请求。问题是fromPromise之前的调用。