Dva: Posso perguntar como o yield put() nos efeitos é um processo sem bloqueio, como bloquear e chamar outro efeito nos efeitos.

Criado em 12 set. 2017  ·  12Comentários  ·  Fonte: dvajs/dva

Código para reproduzir o problema: (Forneça um código ou etapas reproduzíveis)

Comportamento esperado: (efeito normal esperado)

Comportamento real: (efeito real)

Versões dos pacotes usados: (qual versão de qual biblioteca é o problema)

Comentários muito úteis

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, veja a API redux-saga para detalhes

Todos 12 comentários

dva@2 forneceu o exemplo correspondente, 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
Você pode dar uma olhada na solução aqui.
Use chamar diretamente para bloquear o efeito que chama você.

Mas há um problema no dva, ou seja, como você obtém o método de efeito que deseja chamar, porque o método de efeito no dva está escrito no modelo, você mesmo pode pensar nisso e ver se há alguma maneira de obter o destino do método model.e, em seguida, use call para chamá-lo.

@nihgwu

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

Este código está encapsulado em saga? ? Não consigo ver no código fonte do dva. Você pode me dizer o endereço deste código fonte?

@hopperhuang em dva-core

O efeito em @hopperhuang dva está escrito no modelo, só estou incomodado com isso, não sei como tirar. Depois de ler o método do @nihgwu , acho que é a solução correta, chame-o primeiro e, em seguida, leve imediatamente para bloquear a recepção.

Observe a versão. Não sei se a solução proposta é baseada em dva2,0 ou baseada em saga. No código fonte do dva1.0, não há encapsulamento dos eventos antes e depois da chamada do put. Você pode pedir ao Dalian para ver se sua própria versão pode aplicar esta solução.

-----A mensagem original-----
De: "pingsoli" [email protected]
Enviado: ‎2017/‎9/‎12 22:24
Destinatário: "dvajs/dva" [email protected]
CC: "hopperhuang" [email protected] ; "Menção" mençã[email protected]
Tópico: Re: [dvajs/dva] Com licença. Yield put() em efeitos é um processo sem bloqueio. Como bloquear e chamar outro efeito em efeitos. (#1212)

O efeito em @hopperhuang dva está escrito no modelo, só estou incomodado com isso, não sei como tirar. Depois de ler o método do @nihgwu , acho que é a solução correta, chame-o primeiro e, em seguida, leve imediatamente para bloquear a recepção.

Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub ou silencie a conversa.

Por que você deseja bloquear o put? Qual é o cenário do aplicativo aqui?

Por que você deseja bloquear o put? Qual é o cenário do aplicativo aqui?

Se a ação de put for processada por saga (efeito em dva), então quando yield put retornar, a saga/efeito correspondente ainda não foi executada (o redux-saga scheduler irá enfileirar e agendar gradualmente mais tarde), o que não atende os requisitos de bloqueio de alguns processos estaduais.

Se bem me lembro, a ação put é processada pelo redutor sem esse problema, pois quando o yield put retorna, o redutor correspondente já foi executado.

Na verdade, esses são os cuidados do redux-saga, mas na forma de escrever efeitos em dva, a função do gerador é usada como efeito e acionada pela ação put. Na verdade, haverá muitas funções geradoras que não tratam de ações diretamente, mas são chamadas por outras funções saga/gerador.

Minha abordagem pessoal é restaurar o método de escrita ao usar o redux-saga diretamente. Apenas a função do gerador que responde diretamente à ação é colocada nos efeitos dva, e as outras são 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
}

Quando a função geradora gratuita precisa call / select /... da saga, ela pode ser importada diretamente da saga:

import { effects } from 'dva/saga'

const { call, select } = effects

Mas os put e take fornecidos pelo dva para os métodos em seus efeitos são encapsulados uma vez (ou seja, processamento de prefixo de namespace) e devem ser passados ​​pelos métodos de efeitos:
em https://github.com/dvajs/dva/blob/master/packages/dva-core/src/getSaga.js#L141

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

Ou apenas escreva o tipo de ação 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, veja a API redux-saga para detalhes

Por que você deseja bloquear o put? Qual é o cenário do aplicativo aqui?

Se a ação de put for processada por saga (efeito em dva), então quando yield put retornar, a saga/efeito correspondente ainda não foi executada (o redux-saga scheduler irá enfileirar e agendar gradualmente mais tarde), o que não atende os requisitos de bloqueio de alguns processos estaduais.

Se bem me lembro, a ação put é processada pelo redutor sem esse problema, pois quando o yield put retorna, o redutor correspondente já foi executado.

Sim, eu tentei rendimento put(redutores) é síncrono e rendimento put(efeitos) é assíncrono

Por que você não pode colocar direto, você tem que render put???

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