Разница между Observable и Promise.all

Итак, я прочитал об Observables и даже использовал его в своем приложении. Итак, мое понимание Observable — это оболочка вокруг непрерывного потока данных, либо синхронного, либо асинхронного, либо и того, и другого. Таким образом, в основном он может возвращать несколько значений. Также есть наблюдатель, связанный (подписанный) с наблюдаемым. Всякий раз, когда наблюдаемое выполнение получает новое значение, наблюдатель получает его. Итак, у меня было два вопроса-

  1. Если вы хотите вернуть несколько значений, почему бы нам не создать отдельные промисы для каждого из этих запросов и просто поместить их в promise.all, чтобы, когда все они разрешились, у нас было то, что нам нужно, вместо того, чтобы делать несколько запросов в наблюдаемом .

  2. Наше использование любого из них зависит от нашего варианта использования, если мы не уверены, когда, если и сколько значений мы собираемся получить, то когда наблюдаемые наиболее полезны. Так, например, если мы слушаем соединение, где мы получаем живой комментарий к футбольному матчу, а затем отображаем его в нашем приложении. Здесь мы не знали бы, сколько ответов получим.

Я знаю, что это был очень большой вопрос, но я должен был изложить все, что я понимаю прямо сейчас, поэтому, если есть что-то непонятное, кто-нибудь прояснил бы это для меня.

Заранее спасибо.


person Indraneel Bende    schedule 07.09.2017    source источник


Ответы (1)


Хорошо, я могу ошибаться, но они имеют совершенно разные цели. это мое понимание разницы между ними.

  • Основное отличие состоит в том, что обещание может быть разрешено только один раз, поэтому, даже если вы создадите новые обещания и нажмете их, .then of promise.all сработает только один раз. Даже если массив изменится, он не будет разрешен снова.
  • Promise.all предназначен для итерации фиксированной длины, где мы знаем, насколько она велика, а Observable — для непрерывного роста итераций (потоков и т. д.).

Учитывая пункт один и пункт 2, если источник промисов будет продолжать расти, мы никогда не достигнем состояния разрешения, поскольку мы можем разрешить только один раз в промисах, поэтому наблюдаемые здесь хороши. Они будут реагировать всякий раз, когда есть изменение в потоке

 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;

но мы не можем использовать promise.all, если мы используем это в этом сценарии

 var a =  1 + 1 for every second;
 var d = promise.all(a) + 1; //wont work

всегда есть изменения. поэтому мы должны ждать постоянно. И в этом разница между promise.all и наблюдаемыми. Простите за длинный пост.

person Shyam Babu    schedule 07.09.2017
comment
Спасибо Шьям за ответ. Я понимаю, что вы говорите, что как только любое обещание имеет значение в разрешении (или отклонении), оно вернется и никогда не вернется для изменений. Итак, если внутри promise.all есть несколько обещаний, .then() будет вызываться, когда все обещания будут разрешены. Вот почему я сделал второе замечание, комментируя вариант использования (цель) нашей задачи. Я думаю, что мы можем сделать вывод, сказав, что если вы ищете непрерывный поток данных, используются наблюдаемые объекты, а promise.all используется, когда вы хотите что-то сделать после того, как все промисы разрешены. - person Indraneel Bende; 07.09.2017