Javascript 可观察对象的执行方式是否与调用堆栈中的承诺相同?

Javascript 可观察对象的执行方式是否与调用堆栈中的承诺相同?,javascript,es6-promise,callstack,event-loop,redux-observable,Javascript,Es6 Promise,Callstack,Event Loop,Redux Observable,说到Javascript,我完全是个新手。请帮助我理解可观测的概念 可观察对象是否有存储位置,类似于Web API请求在移动到回调队列之前如何保存在Web API环境中 这是原始可观察到的还是已从回调队列移动到调用堆栈的副本 可观察执行与调用堆栈中的承诺有何不同 调用堆栈是否必须为空才能执行可观察对象 是否可以在可观察对象旁边运行正常的函数调用(即,当其余函数分别运行时,它会不断从活动环境中获取数据) 如果我们不取消订阅观察对象,并且它们继续在调用堆栈中运行,直到应用程序关闭,会发生什么 可观察

说到Javascript,我完全是个新手。请帮助我理解可观测的概念

  • 可观察对象是否有存储位置,类似于Web API请求在移动到回调队列之前如何保存在Web API环境中
  • 这是原始可观察到的还是已从回调队列移动到调用堆栈的副本
  • 可观察执行与调用堆栈中的承诺有何不同
  • 调用堆栈是否必须为空才能执行可观察对象
  • 是否可以在可观察对象旁边运行正常的函数调用(即,当其余函数分别运行时,它会不断从活动环境中获取数据)
  • 如果我们不取消订阅观察对象,并且它们继续在调用堆栈中运行,直到应用程序关闭,会发生什么
  • 可观察对象是否有存储位置,类似于Web API请求在移动到回调队列之前如何保存在Web API环境中
  • 否。它们通过一个引用保存在内存中,该引用由触发它们的函数保存。例如,如果您从一个DOM事件创建一个observable,RxJS将向DOM添加一个事件监听器,该监听器保存对该observable的引用。如果删除正在侦听的DOM元素,则垃圾收集器将从内存中收集DOM元素,从而允许对事件处理程序进行垃圾收集,并允许对可观察对象及其内部函数链进行垃圾收集,反过来,允许对订阅回调函数进行垃圾收集——前提是用户代码中不单独保留对可观察对象的引用

  • 这是原始可观察到的还是已从回调队列移动到调用堆栈的副本
  • 根据对问题1的否定回答,该问题并非基于有效假设

  • 可观察执行与调用堆栈中的承诺有何不同
  • 不执行可观察对象,它们是对象。在内部,它们记录一系列函数,当外部函数通过向其提供数据触发可观察对象时,调用这些函数。当然,外部函数可能是重复的计时器回调(想想调度程序),也可能是可能重复或不重复的事件,或者是一次性承诺回调

    承诺有一些相似之处,包括它们是记忆中某处的物体。在内部,它们包含两个回调函数列表,这些函数在承诺履行或拒绝时将被调用,同时还包含
    resolve
    reject
    对承诺链中下一个承诺的引用

    与可观察对象一样,单个Promise对象通过其特定于Promise实例的
    resolve
    reject
    函数保存在内存中。与可观察对象一样,承诺也可以通过引用用户代码中的承诺对象而保存在内存中

  • 调用堆栈是否必须为空才能执行可观察对象
  • 否。如果可观察对象由异步任务触发,则调用堆栈可能几乎为空,除了一些与向可观察对象提供数据相关的代码和负责运行在调用订户回拨功能之前运行的函数链的内部代码。如果可观察对象被同步触发,谁知道调用堆栈上有什么

    5是否可以在可观察对象旁边运行正常的函数调用(即,当其余函数分别运行时,它会不断从活动环境中获取数据)

    是的,除了如果observable是从用户代码同步触发的,则在所有订户回调返回之前,它不会返回到用户代码

    6如果我们不取消订阅观察对象,它们继续在调用堆栈中运行,直到应用程序关闭,会发生什么

    可观察对象不在调用堆栈中,也不由订阅回调函数保存在内存中。它们从数据源事件或函数中被调用,并在调用期间在调用堆栈中创建堆栈帧

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

    注意,可观测值由一个。您并不是直接从通用数据库或fetch或HTTP API接收可观测数据,而是从某个中间软件层接收可观测数据,该软件层将对为您发出的请求的响应包装到一个数据源中,该数据源触发返回给您的可观测数据



    如果这个答案不准确,我深表歉意,因为它基于JavaScript知识和RxJS“表现良好”的假设,足以从文档中推断其逻辑。

    你在说什么可观察的实现?承诺不会执行,只有它们的处理程序会执行,“我怀疑这和可观察的东西有什么不同。@Bergi-从标签上看,“可观察的东西”是library@BergiHTTP方法调用的ex-Observables。@Bergi我不太了解它,但我认为Observables也是函数,对Observables的订阅与调用函数非常相似。我只想知道,假设我们从远程数据库(如firebase)获取登录状态的用户作为可观察对象,并在调用堆栈中执行,它与fetch()有什么不同,fetch()返回承诺并由处理程序解析,以及它们如何从回调队列到调用堆栈,以及