Обещание заканчивается - оно разрешается (then
) или отклоняет (catch
) и все. Наблюдаемые потоки значений до его окончания (много раз, он никогда не заканчивается, вы просто «теряете интерес» или отписываетесь от потока значений).
Мне нравится пример нажатия клавиши - если вы используете обещание для разрешить / отклонить на основе события нажатия клавиши, вы будете когда-либо слушать только «следующее» нажатие клавиши, а затем вам нужно будет создать новое обещание для прослушивания следующего и т. д.
С Наблюдаемые, вам нужно всего лишь создать его, и он будет просто непрерывно передавать вам значения, пока вы не перестанете интересоваться (отписаться).
Promise:
const subscribeToKeyPress = () => {
let resolve;
document.addEventListener('keydown',function listener(e) {
resolve(e);
// unsubscribe from the event listener, otherwise you've got a memory leak
document.removeEventListener('keydown',listener);
});
return new Promise(r => resolve = r);
}
subscribeToKeyPress().then(e => {
// done, never to receive another result
});
#####
Observable:
const subscribeToKeyPress$ = () => fromEvent(document,'keypress);
const unsubscribe = subscribeToKeyPress$().subscribe(e => {
// called continually on each keypress until you unsubscribe
});
unsubscribe(); // your callback function won't be called anymore, if you don't call unsubscribe when you're done, you've got a memory leak
#####
Callback Function - the simplest "observable"
const subscribeToKeyPress = callback => {
const fn = e => callback(e); // this function will get called over and over until you unsubscribe
document.addEventListener('keypress',fn);
return () => document.removeEventListener('keypress',fn);
}
const unsubscribe = subscribeToKeyPress(e => {
// called continually on each keypress until you unsubscribe
});
unsubscribe(); // your callback function won't be called anymore, if you don't call unsubscribe when you're done, you've got a memory leak
Как получить результат из наблюдаемого как массив (аналогично обещанию)?
Проверить https://www.learnrxjs.io/operators/utility/topromise.html
Также имеет отношение к toPromise
: https://github.com/ReactiveX/rxjs/issues/2536
Если ваша наблюдаемая не «завершается» (как слушатель нажатия клавиш), toPromise
никогда не сработает (если вы сначала не pipe(take(1))
, но это много для новичка ie, без обид, но из мира обещаний, наблюдаемые действительно трудно rok - из моего личного опыта - пока их больше нет).