dva@2 ha proporcionado el ejemplo correspondiente, 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
Puedes echar un vistazo a la solución aquí.
Usa llamar directamente para bloquear el efecto que te llama.
Pero hay un problema en dva, es decir, cómo obtiene el método de efecto que desea llamar, porque el método de efecto en dva está escrito en el modelo, puede pensar por sí mismo si hay alguna forma de obtener el objetivo de el método modelo, y luego use call para llamarlo.
@nihgwu
effect 前后会额外触发 /@<strong i="6">@start</strong> 和 /@<strong i="7">@end</strong> 的 action,
¿Este código está encapsulado en saga? ? No puedo verlo en el código fuente de dva. ¿Me puede decir la dirección de este código fuente?
@hopperhuang en dva-core
El efecto en @hopperhuang dva está escrito en el modelo, solo me molesta esto, no sé cómo sacarlo. Después de leer el método de @nihgwu , creo que es la solución correcta, llámelo primero y luego tome inmediatamente para bloquear la recepción.
Tenga en cuenta la versión. No sé si la solución propuesta está basada en dva2,0 o en saga. En el código fuente de dva1.0, no hay encapsulación de los eventos antes y después de que se llame a la opción put. Puede pedirle a Dalian que vea si su propia versión puede aplicar esta solución.
-----El mensaje original-----
De: "pingsoli" [email protected]
Enviado: 9/12/2017 22:24
Destinatario: "dvajs/dva" [email protected]
CC: "hopperhuang" [email protected] ; "Mención" [email protected]
Tema: Re: [dvajs/dva] Disculpe. Yield put() en efectos es un proceso sin bloqueo. Cómo bloquear y llamar a otro efecto en efectos. (#1212)
El efecto en @hopperhuang dva está escrito en el modelo, solo me molesta esto, no sé cómo sacarlo. Después de leer el método de @nihgwu , creo que es la solución correcta, llámelo primero y luego tome inmediatamente para bloquear la recepción.
—
Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub o silencie el hilo.
¿Por qué desea bloquear put?¿Cuál es el escenario de aplicación aquí?
¿Por qué desea bloquear put?¿Cuál es el escenario de aplicación aquí?
Si la acción de put es procesada por saga (efecto en dva), entonces cuando yield put regresa, la saga/efecto correspondiente aún no se ha ejecutado (el programador redux-saga lo pondrá en cola y lo programará gradualmente más tarde), lo que no cumple los requisitos de bloqueo de algunos procesos estatales.
Si no recuerdo mal, la acción de poner es procesada por el reductor sin este problema, porque cuando regresa el rendimiento de poner, el reductor correspondiente ya se ha ejecutado.
En realidad, estas son las precauciones de redux-saga, pero en la forma de escribir efectos en dva, la función de generador se usa como un efecto y se activa mediante la acción de poner. En realidad, habrá muchas funciones generadoras que no manejan acciones directamente, pero que son llamadas por otras funciones de saga/generador.
Mi enfoque personal es restaurar el método de escritura cuando uso redux-saga directamente. Solo la función del generador que responde directamente a la acción se coloca en los efectos dva, y las demás son todas gratuitas.
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
}
Cuando la función de generador libre necesita call
/ select
/... de saga, se puede importar directamente desde saga:
import { effects } from 'dva/saga'
const { call, select } = effects
Pero los put
y take
proporcionados por dva para los métodos en sus efectos se encapsulan una vez (es decir, el procesamiento del prefijo del espacio de nombres) y se deben pasar a través de los métodos de efectos:
en https://github.com/dvajs/dva/blob/master/packages/dva-core/src/getSaga.js#L141
return { ...sagaEffects, put, take };
O simplemente escribe el tipo de acción completo:
import { effects } from 'dva/saga'
const { take } = effects
// then
take(`${namespace}/${actionType}`)
put.resolve() está bloqueando
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() está bloqueando, vea la API redux-saga para más detalles
¿Por qué desea bloquear put?¿Cuál es el escenario de aplicación aquí?
Si la acción de put es procesada por saga (efecto en dva), entonces cuando yield put regresa, la saga/efecto correspondiente aún no se ha ejecutado (el programador redux-saga lo pondrá en cola y lo programará gradualmente más tarde), lo que no cumple los requisitos de bloqueo de algunos procesos estatales.
Si no recuerdo mal, la acción de poner es procesada por el reductor sin este problema, porque cuando regresa el rendimiento de poner, el reductor correspondiente ya se ha ejecutado.
Sí, probé el rendimiento put (reductores) es síncrono y el rendimiento put (efectos) es asíncrono
¿Por qué no puedes ponerlo directamente, tienes que ceder poner?
Comentario más útil
put.resolve() está bloqueando
put.resolve() está bloqueando, vea la API redux-saga para más detalles