Je pense que je dois mal comprendre quelque chose de fondamental, car dans mon esprit, cela devrait être le cas le plus élémentaire pour un observable, mais pour la vie de mon, je ne peux pas comprendre comment le faire à partir de la documentation.
Fondamentalement, je veux pouvoir faire ceci:
// create a dummy observable, which I would update manually
var eventObservable = rx.Observable.create(function(observer){});
var observer = eventObservable.subscribe(
function(x){
console.log('next: ' + x);
}
...
var my_function = function(){
eventObservable.push('foo');
//'push' adds an event to the datastream, the observer gets it and prints
// next: foo
}
Mais je n'ai pas pu trouver une méthode comme push
. J'utilise ceci pour un gestionnaire de clics, et je sais qu'ils l'ont fait Observable.fromEvent
pour cela, mais j'essaie de l'utiliser avec React et je préfère pouvoir simplement mettre à jour le flux de données dans un rappel, au lieu d'utiliser un complètement différent système de gestion d'événements. Donc, fondamentalement, je veux ceci:
$( "#target" ).click(function(e) {
eventObservable.push(e.target.text());
});
Le plus proche que j'ai obtenu était l'utilisation observer.onNext('foo')
, mais cela ne semblait pas fonctionner et cela a été appelé l'observateur, ce qui ne semble pas correct. L'observateur devrait être la chose qui réagit au flux de données, pas le changer, non?
Est-ce que je ne comprends tout simplement pas la relation observateur / observable?
Réponses:
Dans RX, Observer et Observable sont des entités distinctes. Un observateur souscrit à un observable. Un observable émet des éléments à ses observateurs en appelant les méthodes des observateurs. Si vous devez appeler les méthodes d'observateur en dehors de la portée de
Observable.create()
vous pouvez utiliser un objet, qui est un proxy qui agit en même temps comme observateur et observable.Vous pouvez faire comme ceci:
Vous pouvez trouver plus d'informations sur les sujets ici:
la source
Je crois
Observable.create()
que ne prend pas un observateur comme paramètre de rappel, mais un émetteur. Donc, si vous souhaitez ajouter une nouvelle valeur à votre Observable, essayez plutôt ceci:Oui Subject facilite les choses, en fournissant Observable et Observer dans le même objet, mais ce n'est pas exactement la même chose, car Subject vous permet d'abonner plusieurs observateurs au même observable lorsqu'un observable n'envoie des données qu'au dernier observateur abonné, alors utilisez-le consciemment . Voici un JsBin si vous voulez le bricoler.
la source
emitter
, seules lesnext()
nouvelles valeurs pour l'observateur qui a souscrit le dernier. Une meilleure approche serait de collecter tous lesemitter
s dans un tableau et de les parcourir tous etnext
la valeur sur chacun d'eux