Observable может выдавать разные значения в разное время, Promise может разрешать только одно значение за один раз (и затем никогда).
Простая иллюстрация:
Давайте попробуем получитьтри асинхронных результата: «a», «b» и «c», каждый с задержкой еще на 1 секунду.С наблюдаемой это можно сделать следующим образом:
var result = Rx.Observable.create((observer) => {
setTimeout(() => observer.next("a"), 1000);
setTimeout(() => observer.next("b"), 2000);
setTimeout(() => (observer.next("c"), observer.complete()), 3000);
});
result.subscribe(x => console.log(x));
Выше приведенный результат приведет к тому, что каждая строка появится на 1 секунду позже предыдущей:
a
b
c
Если вы попытаетесьсделать это с одним (!) обещанием, оно не будет работать:
var result = new Promise(resolve => {
setTimeout(() => resolve("a"), 1000);
setTimeout(() => resolve("b"), 2000);
setTimeout(() => resolve("c"), 3000);
});
result.then(x => console.log(x));
Это будет выводить только один результат (через 1 секунду):
a
Даже при наличиипопытаться выполнить обещание также с помощью «b» и «c», что не работает: обещание может быть выполнено только один раз.Все последующие вызовы resolve
игнорируются.
Наблюдаемая, однако, может излучать несколько раз, и каждый раз с другим значением.
Обещание прекрасно, когда вам нужен один (возможно, сложный) асинхронный результат.Наблюдаемое больше подходит, когда вы ожидаете серию асинхронных результатов.