Dva: ¿El uso de async / await para realizar efectos asincrónicos no funciona? ¿Tengo que usar * / yield?

Creado en 9 oct. 2016  ·  11Comentarios  ·  Fuente: dvajs/dva

efectos: {

/**
 * 数据查询
 * 
 * <strong i="6">@param</strong> {any} { payload }
 * <strong i="7">@param</strong> {any} { select, call, put }
 */
query: async function ({ payload }, { select, call, put }) {
  await put({ type: 'show_loading' });
  payload.page = payload.page || 1;
  payload.limit = payload.limit || 10;
  let data = await call(query, '/home/course', payload);
  if (data) {
    await put({
      type: 'query_success',
      payload: {
        list: data.data,
        total: data.count,
        current: data.currentPage,
      },
    });
  }
}

},

faq

Comentario más útil

@sorrycc Ya que también mencionaste qué escenarios deben usar cancelar aquí, de hecho, async / await es suficiente en la mayoría de los casos. En el uso actual, use generator / yield para llamar a async / await. Esto es demasiado doloroso. El autor puede considerar admitir ambos modos al mismo tiempo y permitir que los usuarios elijan por sí mismos, como agregar un elemento de configuración y llamar al modo async / await después de la apertura, o juicio adaptativo.

Todos 11 comentarios

efectos: {

/**
 * 数据查询
 * 
 * <strong i="6">@param</strong> {any} { payload }
 * <strong i="7">@param</strong> {any} { select, call, put }
 */
query: function* ({ payload }, { select, call, put }) {
  yield put({ type: 'show_loading' });
  payload.page = payload.page || 1;
  payload.limit = payload.limit || 10;
  let data = yield call(query, '/home/course', payload);
  if (data) {
    yield put({
      type: 'query_success',
      payload: {
        list: data.data,
        total: data.count,
        current: data.currentPage,
      },
    });
  }
}

},

Sí, el efecto solo admite la redacción del generador. async y await se pueden usar fuera del efecto, y luego usar la llamada de rendimiento para ajustar el efecto.

Lo entiendo gracias dios

Disculpe, ¿el efecto tendrá la posibilidad de admitir async en el futuro? @ lo siento

Async no tiene un generador controlable, como cancel , por lo que redux-saga elige usar el generador.

Oh

@sorrycc ¿Cómo puedo cancelar un efecto?

@miaojiuchen ¿Cuál es la escena? ¿Por qué cancelar efecto?

@sorrycc Me

  • efecto 1: la solicitud es exitosa, se devuelve un número y se llama al efecto 2: se procesa el contador de resta
  • efecto 2: while (verdadero) => demora y luego despacha reductor

Esto está bien en una página, pero si visita otras páginas y luego regresa a la página anterior, el efecto 2 se repetirá.
¿Cómo puedo cancelar el efecto en el efecto 1 y luego activar el efecto 2?
¿Tengo que usar suscripciones de ruta para llamar a @@ CANCEL_EFFECTS?

Gracias.

@sorrycc Ya que también mencionaste qué escenarios deben usar cancelar aquí, de hecho, async / await es suficiente en la mayoría de los casos. En el uso actual, use generator / yield para llamar a async / await. Esto es demasiado doloroso. El autor puede considerar admitir ambos modos al mismo tiempo y permitir que los usuarios elijan por sí mismos, como agregar un elemento de configuración y llamar al modo async / await después de la apertura, o juicio adaptativo.

Puede probar redva , el mismo marco

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