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???
Comentários muito úteis
put.resolve() está bloqueando
put.resolve() está bloqueando, veja a API redux-saga para detalhes