gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 20:48:20 25 4
gpt4 key购买 nike

我看到 http 请求发生了 - 在 Chrome 网络选项卡中,也通过在获取 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 相对,除非订阅者被附加,否则它不会工作)。查看"Hot and Cold Observables"此处部分。

Promise -based interfaces 的工作方式很像“热”Observables。也就是说,我们希望一旦调用为我们提供 Promise 的函数,就会开始执行可能代价高昂的操作。当 Promise 被 resolve 时,我们会了解操作的结果,但它会决定我们是否实际监听它(即,将“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com