Dva: Disculpe, el rendimiento put () en efectos es un proceso sin bloqueo, cómo bloquear y llamar a otro efecto en efectos.

Creado en 12 sept. 2017  ·  12Comentarios  ·  Fuente: dvajs/dva

Código para reproducir el problema: (Proporcione un código o pasos reproducibles)

Comportamiento esperado: (efecto normal esperado)

Comportamiento real: (efecto real)

Versiones de paquetes utilizados: (qué versión de qué biblioteca es el problema)

Comentario más útil

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

Todos 12 comentarios

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?

¿Fue útil esta página
0 / 5 - 0 calificaciones