La saga est bien sûr une fonction génératrice, et est asynchrone.
Faut-il jamais utiliser yield * ou faut-il toujours utiliser yield?
Pour répondre complètement à une question, il est d'abord nécessaire de comprendre comment les sagas, middlewares, gestionnaires de processus et les fonctions génératrices fonctionnent généralement. En fait, redux-saga
implémente deux côtés: un middleware pour le store redux, qui intercepte et injecte des actions personnalisées, et un gestionnaire de processus asynchrones, qui possède son propre domaine de rappel de tic et aide à effectuer des actions asynchrones.
Ensuite, chaque fonction saga implémentée par le client est simplement un créateur d'effets. En fait, la fonction saga client est implémentée de telle manière qu'elle ne fait en réalité rien d'autre que la création d'effets - call
, take
, put
, etc. De plus, une saga n'est pas synchrone ou asynchrone par nature - elle délègue simplement certains comportements au gestionnaire de processus saga, et effectue les actions demandées - par exemple, l'attente d'une promesse.
Bien sûr, vous pouvez gérer manuellement les promesses/asynchrone dans une saga client, mais de telles actions sortiront du cycle d'événements de la saga.
Ainsi, les internes de redux-saga
attendent simplement de la saga client qu'elle soit un itérateur, qui renvoie des effets appropriés et peut-être stocke certaines informations dans le contexte d'activation de la fermeture - dans le cas des processus de saga de type while(true)
. Il n'y a donc aucun cas d'utilisation dans redux-saga
où yield *
est obligatoire, puisque yield *
est simplement une ré-délégation de l'itérateur subséquent au niveau supérieur.