【问题标题】:Is there a way to wait for an action in redux-sagas?有没有办法在 redux-sagas 中等待一个动作?
【发布时间】:2017-06-27 21:12:18
【问题描述】:

我有一个获取 API 的传奇 (A)。这与行动(a)有关。我想触发一个内部调用 (a) 的动作 (b),等待它完成,然后 yield 某事。

// saga A -> action_a
function *saga_a(action) {
  yield put( ...action1...);
  yield call(api, ...params);
  yield put( ...action2...);
}


// saga B -> action_b
function *saga_b(action) {
  yield put(..action3..)

  waitFor -- put(action_a)     <------ how to achieve this?

  yield put(..action4..)
 }

【问题讨论】:

  • await put(action_a) 工作吗?
  • 没有await有办法吗?

标签: reactjs redux redux-saga


【解决方案1】:

是的,有。您可以使用take 来实现这一点。

function *saga_b(action) {
  ...

  yield take('action_a') // this will put the saga_b essentially on hold until `action_a` is handled by the reducer

  ...
}

更新

您可以使用saga-toolkit 来进行put等待 操作,而无需take-ing 它们:

const resultOfFetchSomething = yield putAsync(fetchSomething()) // dispatches action "fetchSomething" & wait for the saga that is attached to it to finish running

【讨论】:

  • 要清楚,它被推迟到 action_a 被减速器处理
  • take(patternOrChannel): argument [object Object] is not valid channel or a valid pattern... 在哪个世界你可以take 一个动作? put(action); take('actionType'); 也不起作用
【解决方案2】:

我的代码库执行方式是直接调用另一个 saga。不幸的是,它将两者结合在一起,但是由于您需要等待,因此至少结合起来会更加明确。

function *saga_b(action) {
  yield put(..action3..)
  yield call(saga_a, action_a)
  yield put(..action4..)
}

【讨论】:

  • 这就是我最终要做的。我希望有一种更清洁的方式来做到这一点。但我想没有。感谢您的回答。
【解决方案3】:

这有点晚了,但我在同样的事情上苦苦挣扎,相信人们仍然有同样的问题。我必须编写自己的扩展来实现这个功能。见https://github.com/kutlugsahin/redux-saga-callback

最终你将能够做到这一点

// saga B -> action_b
function *saga_b(action) {
  yield put(..action3..)

  yield putWait(action_a)     <------ how to achieve this?

  yield put(..action4..)
 }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多