Dva: Puis-je demander comment yield put() dans les effets est un processus non bloquant, comment bloquer et appeler un autre effet dans les effets.

Créé le 12 sept. 2017  ·  12Commentaires  ·  Source: dvajs/dva

Code permettant de reproduire le problème : (veuillez fournir un code ou des étapes reproductibles)

Comportement attendu : (effet normal attendu)

Comportement réel : (effet réel)

Versions des packages utilisés : (quelle version de quelle bibliothèque pose problème)

Commentaire le plus utile

put.resolve() bloque

yield put.resolve({ type: 'addDelay', payload: { amount: 2 } });
const count = yield select(state => state.count);
yield put({ type: 'addDelay', payload: { amount: count, delay: 0 } });

put.resolve() bloque, voir l'API redux-saga pour plus de détails

Tous les 12 commentaires

dva@2 a fourni l'exemple correspondant, https://github.com/sorrycc/blog/issues/48

yield put({ type: 'addDelay', payload: { amount: 2 } });
yield take('addDelay/@<strong i="8">@end</strong>');
const count = yield select(state => state.count);
yield put({ type: 'addDelay', payload: { amount: count, delay: 0 } });

https://github.com/redux-saga/redux-saga/issues/744
Vous pouvez jeter un œil à la solution ici.
Utilisez appeler directement pour bloquer l'effet qui vous appelle.

Mais il y a un problème dans dva, c'est-à-dire comment obtenir la méthode d'effet que vous voulez appeler, car la méthode d'effet dans dva est écrite dans le modèle, vous pouvez penser par vous-même s'il existe un moyen d'obtenir la cible de la méthode du modèle, puis utilisez call pour l'appeler.

@nihgwu

effect 前后会额外触发 /@<strong i="6">@start</strong> 和 /@<strong i="7">@end</strong> 的 action,

Ce code est-il encapsulé dans saga ? ? Je ne le vois pas dans le code source de dva. Pouvez-vous me donner l'adresse de ce code source ?

@hopperhuang dans dva-core

L'effet dans @hopperhuang dva est écrit dans le modèle, je suis juste gêné par ça, je ne sais pas comment le sortir. Après avoir lu la méthode de @nihgwu , je pense que c'est la bonne solution, appelez d'abord, puis prenez immédiatement le bloc pour recevoir.

Notez la version. Je ne sais pas si la solution proposée est basée sur dva2,0 ou sur saga. Dans le code source de dva1.0, il n'y a pas d'encapsulation des événements avant et après l'appel du put.Vous pouvez demander à Dalian de voir si votre propre version peut appliquer cette solution.

-----Le message d'origine-----
De : "pingsoli" [email protected]
Envoyé: ‎2017/‎9/‎12 22:24
Destinataire : "dvajs/dva" [email protected]
CC : "hopperhuang" [email protected] ; "Mention" [email protected]
Sujet : Re : [dvajs/dva] Excusez-moi. Yield put() dans les effets est un processus non bloquant. Comment bloquer et appeler un autre effet dans les effets. (#1212)

L'effet dans @hopperhuang dva est écrit dans le modèle, je suis juste gêné par ça, je ne sais pas comment le sortir. Après avoir lu la méthode de @nihgwu , je pense que c'est la bonne solution, appelez d'abord, puis prenez immédiatement le bloc pour recevoir.

Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, consultez-le sur GitHub ou désactivez le fil de discussion.

Pourquoi voulez-vous bloquer le put ? Quel est le scénario d'application ici ?

Pourquoi voulez-vous bloquer le put ? Quel est le scénario d'application ici ?

Si l'action de put est traitée par saga (effet dans dva), alors lorsque yield put revient, la saga/effet correspondant n'a pas encore été exécuté (le planificateur redux-saga le mettra en file d'attente et le planifiera progressivement plus tard), ce qui ne répond pas les exigences de blocage de certains processus d'état.

Si je me souviens bien, l'action put est traitée par le réducteur sans ce problème, car lorsque yield put revient, le réducteur correspondant a déjà été exécuté.

Ce sont en fait les précautions de redux-saga, mais dans la manière d'écrire des effets en dva, la fonction générateur est utilisée comme effet et déclenchée par l'action put. Il y aura en fait de nombreuses fonctions génératrices qui ne gèrent pas directement les actions, mais sont appelées par d'autres fonctions saga/génératrices.

Mon approche personnelle est de restaurer la méthode d'écriture lors de l'utilisation directe de redux-saga.Seule la fonction génératrice qui répond directement à l'action est mise dans les effets dva, et les autres sont toutes libres.

const model = {
  // ...

  effects: {
    * showItem({ payload }, { call }) {

      // 用:
      yield call(showItemFirstStageProcedure)
      yield call(showItemSecondStageProcedure)

      // 而不是:
      // yield put({ type: 'showItemFirstStage' })
      // yield take('showItemFirstStage/@<strong i="7">@end</strong>')
      // yield put({ type: 'showItemSecondStage' })
      // yield take('showItemSecondStage/@<strong i="8">@end</strong>')
      // ...after second stage
    },

    // ...
    // end effects
  },

  // ...
  // end model
}

Lorsque la fonction de générateur libre a besoin call / select /... de saga, elle peut être importée directement depuis saga :

import { effects } from 'dva/saga'

const { call, select } = effects

Mais les put et take fournis par dva pour les méthodes dans ses effets sont encapsulés une seule fois (à savoir, le traitement du préfixe d'espace de noms) et doivent être passés par les méthodes d'effets :
dans https://github.com/dvajs/dva/blob/master/packages/dva-core/src/getSaga.js#L141

return { ...sagaEffects, put, take };

Ou écrivez simplement le type d'action complet :

import { effects } from 'dva/saga'

const { take } = effects

// then
take(`${namespace}/${actionType}`)

put.resolve() bloque

yield put.resolve({ type: 'addDelay', payload: { amount: 2 } });
const count = yield select(state => state.count);
yield put({ type: 'addDelay', payload: { amount: count, delay: 0 } });

put.resolve() bloque, voir l'API redux-saga pour plus de détails

Pourquoi voulez-vous bloquer le put ? Quel est le scénario d'application ici ?

Si l'action de put est traitée par saga (effet dans dva), alors lorsque yield put revient, la saga/effet correspondant n'a pas encore été exécuté (le planificateur redux-saga le mettra en file d'attente et le planifiera progressivement plus tard), ce qui ne répond pas les exigences de blocage de certains processus d'état.

Si je me souviens bien, l'action put est traitée par le réducteur sans ce problème, car lorsque yield put revient, le réducteur correspondant a déjà été exécuté.

Oui, j'ai essayé le yield put(reducers) est synchrone et le yield put(effects) est asynchrone

Pourquoi ne pouvez-vous pas le mettre directement, vous devez céder le put ???

Cette page vous a été utile?
0 / 5 - 0 notes