我看到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()
答案 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
之前的调用。