Dva: Могу я спросить, почему yield put() в Effects является неблокирующим процессом, как заблокировать и вызвать другой эффект в Effects.

Созданный на 12 сент. 2017  ·  12Комментарии  ·  Источник: dvajs/dva

Код для воспроизведения проблемы: (предоставьте воспроизводимый код или шаги)

Ожидаемое поведение: (ожидаемый нормальный эффект)

Фактическое поведение: (фактический эффект)

Версии используемых пакетов: (какая версия какой библиотеки является проблемой)

Самый полезный комментарий

put.resolve() блокирует

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() блокирует, подробности см. в Redux-saga API.

Все 12 Комментарий

dva@2 предоставил соответствующий пример, 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
Посмотреть решение можно здесь.
Используйте вызов напрямую, чтобы заблокировать вызывающий вас эффект.

Но в dva есть проблема, то есть как получить метод эффекта, который вы хотите вызвать, потому что метод эффекта в dva прописан в модели, вы можете подумать об этом сами и посмотреть, есть ли способ получить цель из метода model., а затем используйте call для ее вызова.

@nihgwu

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

Этот код инкапсулирован в саге? ? Я не вижу этого в исходном коде dva. Можете ли вы сказать мне адрес этого исходного кода?

@hopperhuang в два ядра

Эффект в @hopperhuang dva прописан в модели, меня просто это напрягает, не знаю как его вытащить. Прочитав метод @nihgwu , я думаю, что это правильное решение, сначала вызвать его, а затем сразу взять, чтобы заблокировать прием.

Обратите внимание на версию. Я не знаю, основано ли предлагаемое решение на dva2,0 или на основе саги. В исходном коде dva1.0 нет инкапсуляции событий до и после вызова put.Вы можете попросить Dalian посмотреть, может ли ваша собственная версия применить это решение.

----- Исходное сообщение -----
От: "pingsoli" [email protected]
Отправлено: 2017/9/12 22:24
Получатель: "dvajs/dva" [email protected]
Копия: «hopperhuang» [email protected] ; «Упоминание» упоминать@noreply.github.com
Тема: Re: [dvajs/dva] Извините.Выход put() в эффектах неблокирующий процесс.Как заблокировать и вызвать другой эффект в эффектах.(#1212)

Эффект в @hopperhuang dva прописан в модели, меня просто это напрягает, не знаю как его вытащить. Прочитав метод @nihgwu , я думаю, что это правильное решение, сначала вызвать его, а затем сразу взять, чтобы заблокировать прием.

Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите ветку.

Почему вы хотите блокировать?Какой здесь сценарий применения?

Почему вы хотите блокировать?Какой здесь сценарий применения?

Если действие put обрабатывается сагой (эффект в dva), то при возврате yield put соответствующая сага/эффект еще не была выполнена (планировщик redux-saga поставит ее в очередь и постепенно запланирует позже), что не соответствует требования блокировки некоторых процессов состояния.

Если я правильно помню, действие put обрабатывается редюсером без этой проблемы, потому что когда yield put возвращается, соответствующий редьюсер уже был выполнен.

На самом деле это меры предосторожности в Redux-saga, но в способе написания эффектов в dva функция генератора используется как эффект и запускается действием put. На самом деле будет много функций-генераторов, которые не обрабатывают действия напрямую, но вызываются другими функциями саги/генератора.

Мой личный подход заключается в том, чтобы вернуться к методу написания при использовании редукс-саги напрямую.В два эффекта помещается только функция генератора, которая непосредственно реагирует на действие, а остальные все бесплатны.

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
}

Когда функции бесплатного генератора требуются call / select /... саги, ее можно импортировать непосредственно из саги:

import { effects } from 'dva/saga'

const { call, select } = effects

Но put и take , предоставляемые dva для методов в его эффектах, инкапсулируются один раз (а именно, обработка префикса пространства имен) и должны передаваться через методы эффектов:
в https://github.com/dvajs/dva/blob/master/packages/dva-core/src/getSaga.js#L141

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

Или просто напишите полный тип действия:

import { effects } from 'dva/saga'

const { take } = effects

// then
take(`${namespace}/${actionType}`)

put.resolve() блокирует

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() блокирует, подробности см. в Redux-saga API.

Почему вы хотите блокировать?Какой здесь сценарий применения?

Если действие put обрабатывается сагой (эффект в dva), то при возврате yield put соответствующая сага/эффект еще не была выполнена (планировщик redux-saga поставит ее в очередь и постепенно запланирует позже), что не соответствует требования блокировки некоторых процессов состояния.

Если я правильно помню, действие put обрабатывается редюсером без этой проблемы, потому что когда yield put возвращается, соответствующий редьюсер уже был выполнен.

Да, я пробовал yield put(reducers) синхронно, а yield put(effects) асинхронно

Почему нельзя поставить прямо, приходится уступать место???

Была ли эта страница полезной?
0 / 5 - 0 рейтинги