RxJS et React's setState – exécution de la fonction de retard jusqu'à l'abonnement

RxJS a une fonction nifty , fromCallback qui prend une fonction dont le dernier paramètre est un rappel et renvoie un Observable . Et je veux combiner cela avec la fonction setState de React afin que je puisse faire quelque chose d'analogue à:

 const setState = Rx.Observable.fromCallback(this.setState); setState({ myState: 'Hi there!' }).concat(....) 

De sorte que toutes les opérations enchaînées à setState sont garanties après l'établissement de l'état et, surtout, que setState n'est pas invoqué tant qu'il n'y a pas d'abonné actif.

Ce que j'ai remarqué, c'est que même sans abonnement, setState s'appelle comme il est défini et définit l'état de mon composant. Donc, si j'ai:

 networkSignal.flatMap((x) => { return setState({ myState: 'test' }); }); 

La fonction setState est immédiatement invoquée, mais l'observateur que les producteurs setState pas avant qu'il y ait un abonné. Ce que je veux, c'est que la fonction n'invoque que lorsqu'il y a un abonné.

En regardant la source, vous pouvez voir que RxJS renvoie une fonction qui, lorsqu'il est exécuté, crée une valeur observable mais invoque immédiatement la fonction – l'argument de rappel.

fromCallback renvoie une fonction qui, lorsqu'elle est exécutée, renvoie une valeur observable. Ce qui est observable est l'endroit où le (s) résultat (s) asynchrone (s) de l'appel de fonction évoluera.

Pour retarder l'exécution de la fonction, vous pouvez utiliser .defer . Par exemple:

 const setState = Rx.Observable.fromCallback(this.setState); const deferred$ = Rx.Observable.defer(function (){return setState({ myState: 'Hi there!' }).concat(....)}); // Later on deferred$.subscribe(...) 

Question dont les réponses ont utilisé la même technique ont été posées ici et ici