Il tuo riassunto e la domanda collegata sono entrambi corretti, penso che la terminologia potrebbe confondervi. Vi propongo di pensare a osservabili caldi e freddi come osservabili attivi e passivi (rispettivamente).
Cioè, un osservatore attivo (caldo) emetterà elementi indipendentemente dal fatto che qualcuno si sia iscritto o meno. L'esempio canonico, ancora una volta, gli eventi di clic sul pulsante si verificano sia che qualcuno li stia ascoltando oppure no. Questa distinzione è importante perché, se, per esempio, faccio clic su un pulsante e poi mi iscrivo ai clic del pulsante (in questo ordine), non vedrò il clic del pulsante che è già successo.
Un osservabile passivo (freddo) attenderà finché un utente non esiste prima di emettere gli elementi. Immagina un pulsante in cui non puoi fare clic su di esso fino a quando qualcuno non sta ascoltando gli eventi: questo assicurerebbe che tu veda sempre ogni singolo evento.
Tutti gli oggetti osservabili Rx sono "a freddo" (o passivi) per impostazione predefinita? No, Rx.fromEvent(input, 'click')
per esempio è un osservabile caldo (o attivo).
Ho anche letto che Rx.fromEvent(input, 'click')
è un freddo osservabile (?)
Questo non è il caso.
Esistono operatori Rx che trasformano un osservabile a freddo in un osservabile caldo?
Il concetto di trasformare una calda (attivo) osservabile in una fredda (passivo) osservabile è questa: è necessario registrare gli eventi che accadono mentre nulla è attualmente sottoscritto e offrire tali articoli (in vari modi) per gli abbonati che vieni in futuro Un modo per farlo è usare un Subject. Ad esempio, è possibile utilizzare uno ReplaySubject
per il buffer degli elementi emessi e riprodurli ai futuri abbonati.
I due operatori nominati (publish
e share
) utilizzano entrambi i temi internamente per offrire tale funzionalità.
Come funziona con l'operatore Rx withLatestFrom
? Let cold$
essere un osservabile freddo che è stato sottoscritto. Sarà something$.withLatestFrom(cold$,...)
un osservabile caldo?
Se something
è un osservabile caldo, quindi sì. Se something
è un osservabile a freddo, quindi no. Tornando all'esempio eventi, se something
è un flusso di eventi click del pulsante:
var clickWith3 = Rx.fromEvent(input, 'click')
.withLatest(Rx.Observable.from([1, 2, 3]);
O se lo faccio foo$.withLatestFrom(cold$,...), bar$.withLatestFrom(cold$,...)
e sottoscrivere foo
e bar
, sarò sempre gli stessi valori per entrambi?
Non sempre. Ancora una volta, se foo
e bar
sono clic su pulsanti diversi, ad esempio, vedresti valori diversi.Inoltre, anche se fossero lo stesso pulsante, se la tua funzione di combinazione (il secondo argomento a withLatest
) non restituisce lo stesso risultato per gli stessi input, non visualizzerai gli stessi valori (perché verrebbe chiamato due volte, come spiegato sotto).
Ho pensato che Rx.fromEvent
crea osservabili freddi ma non è il caso, come menzionato in una delle risposte. Tuttavia, sono ancora sconcertato da questo comportamento: codepen.io/anon/pen/NqQMJR?editors=101. Abbonamenti diversi ricevono valori diversi dallo stesso osservabile. L'evento click
non è stato condiviso?
Indicherò a this great answer by Enigmativity una domanda che avevo sullo stesso comportamento. Questa risposta lo spiegherà molto meglio di me, ma il succo è che la fonte (l'evento click) è "condivisa", sì, ma le tue operazioni su di essa non lo sono. Se si desidera condividere non solo l'evento click ma anche l'operazione su di esso, è necessario farlo esplicitamente.
L'affermazione "Tutti gli osservatori potranno consumare la stessa sequenza di valori" sulle osservabili freddo non è vero. È vero un sacco di tempo, ma anche il semplice caso di mutare un elemento in un array che io accendo a un osservabile significa che i valori cambiano. E potrei anche creare un generatore di numeri casuali osservabile che sarebbe freddo, ma raramente ripeto i numeri di sempre. – Enigmativity
Questo è corretto. In realtà questo è esattamente il caso che è presente nella codepen collegata e che ha generato le mie domande in quel momento. Spero che la mia risposta fornita sia più chiara su cosa succede in abbonamento. – user3743222