Observables 是否也像调用栈中的 promises 一样执行?

Is Observables is also executed in the same way like promises in the call stack?

在 Javascript 方面我完全是个新手。请帮助我理解 Observables 的概念。

  1. Observables 是否有存储位置,类似于 Web API 请求在移动到回调队列之前如何保存在 Web API 环境中?
  2. 这是原始可观察对象还是已从回调队列移至调用堆栈的副本?
  3. Observables 执行与调用栈中的 promises 有何不同?
  4. 调用堆栈是否必须为空才能执行 Observables?
  5. 是否可以 运行 正常函数调用与 Observables 一起调用(即,它不断从实时环境中获取数据,而其余函数 运行 分开)?
  6. 如果我们不取消订阅 Observables 并且它们继续在调用堆栈中运行直到应用程序关闭,会发生什么情况?
  1. Do Observables have a storage location, similar to how Web API requests are saved in the Web API Environment before being moved to the Call Back Queue?

No.They 通过引用它们被触发它们的函数保存在内存中。例如,如果您从 DOM 事件创建一个可观察对象,RxJS 将向 DOM 添加一个事件监听器,该监听器持有对可观察对象的引用。如果删除正在监听的 DOM 元素,DOM 元素会被垃圾回收器从内存中回收,从而允许事件处理程序被垃圾回收,从而使 observable 及其内部函数链成为垃圾收集,进而允许订阅回调函数被垃圾收集——前提是用户代码中没有单独保留对 observable 的引用。

  1. Is this the original observable or a copy of that has been moved from the callback queue to the Call stack?

根据对问题 1 的否定回答,此问题不是基于有效假设。

  1. How Observables execution is different from promises in the call stack?

Observables 不被执行,它们是对象。在内部,它们记录了一系列函数,当外部函数通过向其提供数据来触发可观察对象时,这些函数将被调用。当然,外部函数可能是一个重复的定时器回调(想想调度器),或者一个可能重复或不重复的事件,或者一个一次性的承诺回调。

Promises 有一些 相似之处,包括它们是位于内存某处的对象这一事实。在内部,它们包含两个回调函数列表,如果承诺被履行或拒绝,以及对承诺链中下一个承诺的 resolvereject 引用。

与可观察对象一样,各个 Promise 对象通过它们的 resolvereject 函数保存在内存中,这些函数是 promise 实例特有的。与 observable 一样,promise 也可以通过引用用户代码中保存的 Promise 对象保存在内存中。

  1. Is it necessary for the call stack to be empty in order to execute the Observables?

没有。如果 observable 是由异步任务触发的,调用堆栈可能几乎是空的,除了一些与向 observable 对象提供数据相关的代码和负责 运行ning 运行 函数链的内部代码在调用订阅者回调函数之前。如果同步触发 observable 谁知道调用堆栈上有什么。

5 Is it possible to run normal function calls alongside Observables (i.e., it keeps fetching data from the live environment while the rest of the functions are run separately)?

是的,除了如果 observable 是从用户代码同步触发的,它不会 return 到用户代码,直到所有订阅者回调都已 returned。

6 What happens if we don't unsubscribe the Observables and they continue to operate in the Call stack until the app is closed?

Observables 不在调用堆栈中,也不由订阅回调函数保存在内存中。它们从数据源事件或函数中调用,并在调用期间在调用堆栈中创建一个堆栈帧。

如果数据源不释放它对可观察对象的引用,则可观察对象只是坐在内存中而不做任何事情。如果引用 observable 的数据源不再保存在内存中,并且用户代码中没有保存对 observable 的引用,则 observable 有资格从内存中进行垃圾回收。如果用户代码没有引用它(例如,如果它是一个内联匿名函数),那么订阅回调函数也将有资格从内存中收集。

请注意,JavaScript library 支持 observable。您不是直接从通用数据库或获取或 HTTP API 接收可观察数据,而是从某个中间软件层接收可观察数据,该中间软件层将对为您发出的请求的响应包装到触发可观察数据的数据源中 returned你.


如果此答案包含不准确之处,我深表歉意,因为它是基于对 JavaScript 的了解以及 RxJS 的“行为良好”足以从文档中推断其逻辑的假设。