我看到 http 请求发生 - 在 Chrome 网络选项卡中,并且还通过在 fetch Promise 中使用 then()
- 使用下面的代码,尽管从未订阅内部可观察值( saveCourses$
)。
根据更新的 rxjs 文档,我修改为使用 from()
而不是 fromPromise()
,但也会发生同样的情况。
我的理解是内部Observable不应该运行?
ngOnInit() {
this.form.valueChanges.pipe(
filter(() => this.form.valid)
)
.subscribe(changes => {
const saveCourses$ = fromPromise(fetch(`/api/courses/${this.course.id}`, {
method: 'PUT',
body: JSON.stringify(changes),
headers: {
'content-type': 'application/json'
}
}));
});
}
最佳答案
虽然基于 Observable 的接口(interface)通常会将昂贵的工作(例如网络调用)推迟到被订阅为止,但这并不是绝对必要的。有时,返回 Observable 的方法甚至在其 subscribe 之前就已经完成或开始了很多工作。方法被调用。如果 Observable 在被订阅之前就可以工作,那么它通常被称为“热”(与“冷”Observable 相对,除非附加了订阅者,否则“冷”Observable 不会工作)。请参阅"Hot and Cold Observables"此处部分。
Promise基于接口(interface)的工作方式很像“热”Observables。也就是说,我们期望一旦我们调用提供 Promise 的函数,就会开始潜在的昂贵操作。当 Promise 被解析时,我们了解操作的结果,但它会解析我们是否真正监听它(即,将“then”处理程序连接到 Promise)。
在您的示例中,您的 Observable 是使用 fromPromise
方法创建的:
fromPromise(fetch(`/api/courses/${this.course.id}`...)
fromPromise 的工作原理本质上是等待 Promise 被解析,当解析完成时,通过新创建的 Observable 发出 Promise 的解析值。这里重要的是,fromPromise
必须调用 fetch() 才能获取构建 Observable 的 Promise。并且调用 fetch 的行为会导致发起网络调用。
因此,在这种情况下,与大多数“典型”使用 Observables 进行网络或其他长时间操作不同,您不需要调用 .subscribe() 来执行操作。一旦 fetch
被调用,它就会立即执行,并且 fetch
是在 Observable 创建时调用,而不是在订阅时调用。 >.
关于javascript - 即使没有订阅,Observable 内的 http 请求也会发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53286573/