有没有一种方法可以等待一个行动在redux-sagas?

dly7yett  于 2023-08-05  发布在  其他
关注(0)|答案(4)|浏览(76)

我有一个 Saga (A),它获取API。这与行动(a)有关。我想触发一个动作(B),它在内部调用(a),等待它完成,然后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..)
 }

字符串

frebpwbc

frebpwbc1#

是的,有。您可以使用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来执行putwait for 操作,而无需take-ing它们:

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

flseospp

flseospp2#

我做这件事的方式我的代码基地是通过调用其他 Saga 直接。不幸的是,它将两者耦合在一起,但由于您需要等待,耦合至少会更显式。

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

字符串

wtlkbnrh

wtlkbnrh3#

这是一个有点晚,但我挣扎与同样的事情,并相信人们仍然有同样的问题。我不得不编写自己的扩展来实现这个功能。参见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..)
 }

字符串

jw5wzhpr

jw5wzhpr4#

使用call代替put,直接调用 Saga 生成器代替action,如:

yield call(saga_a, {payload: {param1: "param_one", param2: "param_two"}, type: 'unique_name')

字符串

相关问题