Dva: Usar async / await para fazer efeitos assíncronos não funciona? Devo usar * / yield?

Criado em 9 out. 2016  ·  11Comentários  ·  Fonte: dvajs/dva

efeitos: {

/**
 * 数据查询
 * 
 * <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

Comentários muito úteis

@sorrycc Como você também mencionou quais cenários precisam ser cancelados aqui, na verdade, async / await é suficiente na maioria dos casos. No uso atual, use gerador / rendimento para chamar assíncrono / esperar. Isso é muito doloroso. O autor pode considerar o suporte de ambos os modos ao mesmo tempo e permitir que os usuários escolham por si mesmos, como adicionar um item de configuração e chamar o modo assíncrono / esperar após a abertura, Ou julgamento adaptativo.

Todos 11 comentários

efeitos: {

/**
 * 数据查询
 * 
 * <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,
      },
    });
  }
}

},

Sim, o efeito suporta apenas o texto do gerador. async e await podem ser usados ​​fora do efeito e, em seguida, use a chamada de rendimento para ajustar o efeito.

Eu entendo obrigado deus

Com licença, o efeito terá uma chance de oferecer suporte ao assíncrono no futuro? @sorrycc

Async não tem gerador controlável, como cancel , razão pela qual redux-saga escolheu usar gerador.

Oh

@sorrycc Como posso cancelar um efeito?

@miaojiuchen Qual é a cena? Por que cancelar o efeito?

@sorrycc Encontrei este cenário:

  • efeito 1: a solicitação é bem-sucedida, um número é retornado e o efeito 2 é chamado - o contador de subtração é processado
  • efeito 2: enquanto (verdadeiro) => atrasar e, em seguida, despachar o redutor

Isso é bom em uma página, mas se você visitar outras páginas e depois retornar à página anterior, o efeito 2 será repetido.
Como posso cancelar o efeito no efeito 1 e, em seguida, acionar o efeito 2?
Devo usar inscrições de caminho para chamar @@ CANCEL_EFFECTS?

obrigado.

@sorrycc Como você também mencionou quais cenários precisam ser cancelados aqui, na verdade, async / await é suficiente na maioria dos casos. No uso atual, use gerador / rendimento para chamar assíncrono / esperar. Isso é muito doloroso. O autor pode considerar o suporte de ambos os modos ao mesmo tempo e permitir que os usuários escolham por si mesmos, como adicionar um item de configuração e chamar o modo assíncrono / esperar após a abertura, Ou julgamento adaptativo.

Você pode tentar redva , o mesmo framework

Esta página foi útil?
0 / 5 - 0 avaliações