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

标签 javascript angular ecmascript-6 rxjs6

我看到 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/

相关文章:

angular - 将 div 的高度设置为等于窗口 Angular 高度

angular - Protractor 等待休息调用完成

javascript - 如何从 JavaScript 中的字符串中提取数字?

angular - 从父组件更新子组件

javascript - 使用c#创建合法的javascript文件

javascript - 我的 JS 字谜图解决方案的时间、空间复杂度

javascript - React-select 未在请求负载中发送

node.js:导出普通函数或箭头函数?

javascript - 使用 jQuery 删除类时,将该类包含在选择器中是否更好?

javascript - 如果检查了输入,我需要增加变量 x 的值,然后警告总计 x