Javascript 可观察和承诺之间的差异

Javascript 可观察和承诺之间的差异,javascript,promise,observable,observers,Javascript,Promise,Observable,Observers,所以我已经阅读了关于可观测的内容,甚至在我创建的一个应用程序中使用了它。这就是我对可观测数据的理解——它是一个围绕着连续数据流的包装器,数据流可以是同步的,也可以是异步的,或者两者兼而有之。所以基本上它可以返回多个值。还有一个观察者与被观察者相关联(订阅)。每当可观察执行收到新值时,观察者就会收到它。所以我有两个问题- 如果您想返回多个值,为什么不为每个请求创建单独的承诺,并简单地将它们放在promise.all中,这样当所有请求都解决时,我们就得到了我们所需要的,而不是以可观察的方式发出多个请

所以我已经阅读了关于可观测的内容,甚至在我创建的一个应用程序中使用了它。这就是我对可观测数据的理解——它是一个围绕着连续数据流的包装器,数据流可以是同步的,也可以是异步的,或者两者兼而有之。所以基本上它可以返回多个值。还有一个观察者与被观察者相关联(订阅)。每当可观察执行收到新值时,观察者就会收到它。所以我有两个问题-

  • 如果您想返回多个值,为什么不为每个请求创建单独的承诺,并简单地将它们放在promise.all中,这样当所有请求都解决时,我们就得到了我们所需要的,而不是以可观察的方式发出多个请求

  • 我们对它们的使用取决于我们的用例,如果我们不确定何时、是否以及将收到多少值,那就是可观察到的值最有用的时候。例如,如果我们正在收听一个连接,我们会收到一场足球比赛的实况解说,然后在我们的应用程序中显示它。在这里,我们不知道会收到多少回复

  • 我知道这是一个很大的问题,但我现在必须陈述我所理解的一切,所以如果有什么不清楚的地方,有人会帮我澄清


    提前谢谢。

    好的,我可能错了,但它们的用途完全不同。这就是我对它们之间区别的理解

    • 主要区别在于,承诺只能解决一次,因此,即使您创建了新的承诺并将其推送到。那么,承诺的所有将只触发一次。即使阵列更改,它也不会再次解决
    • Promise.all适用于固定长度的iterable,我们知道它有多大,而Observable适用于持续增长的iterable(溪流等)
    考虑到第一点,以及第二点,如果承诺源持续增长,我们将永远不会达到解决状态,因为我们只能在承诺中解决一次,这就是为什么在这里观测值是好的。只要有变化,他们就会做出反应

     var a = async(b + c);
     var d = wait for a;
     what is d?
    
    在承诺知道d时,我们只需要b+c。我们知道它会发生,但只有我们不知道什么时候,所以我们只是等待。 它最终将(解决)的链中有多少并不重要。 即使是铁链

     var a = async(b+c) + async (c+d)
     var d = promise.all(a)
    
    这是承诺。所有人都在等待一切,但在事情发生后(解决),再等待承诺是没有意义的。因为我们不在乎a会发生什么

     var a =  1 + 1 for every second;
     var d = a + 1;
     what is d?
    
    在这里,我们永远不会知道d的值是多少,它永远在变化。我们只能读取当前值(观察)a并给出当前值d

     var a =  1 + 1 for every second;
     var d = observe(a) + 1;
    
    但是我们不能使用诺言。如果我们在这种情况下使用它

     var a =  1 + 1 for every second;
     var d = promise.all(a) + 1; //wont work
    
    总是有变化的。所以我们必须永远等待。这就是承诺、一切和可观察之间的区别。
    很抱歉发了这么长的帖子。

    谢谢Shyam的回复。我确实明白你所说的,一旦任何一个承诺有了解决(或拒绝)的价值,它就会回来,永远不会回去改变。因此,如果promise.all中有多个承诺,那么当所有承诺都解决时,将调用.then()。这就是为什么我在评论我们任务的用例(目的)时提出了第二点。我想我们可以这样总结:如果你在寻找一个连续的数据流,可以使用可观测数据和承诺。当你想在所有承诺解决后做某事时,可以使用所有承诺。