【问题标题】:redux saga wait for put to finish?redux saga 等待完成?
【发布时间】:2019-05-13 17:41:33
【问题描述】:

我想依次调用 2 个 api 调用。

两个 api 分别工作正常。

我做了一个传奇(?),它确实

yield put(createAction1(arg1))
yield put(createAction2(arg2))

但我认为它们同时运行(不保证执行顺序)

我用谷歌搜索并发现了建议做的 github 问题

response1 = yield call(apiCallFunc, createAction1(arg1))
response2 = yield call(apiCallFunc, createAction2(arg2))

然后我必须 success 对 response1 和 response2 执行操作。
我想知道是否没有办法使用put 重用已经创建的saga(?)?

  • 编辑

我不知道以下示例中checkout 的正确名称。我在我的问题中称他们为传奇(?).. 我想利用现有的checkoutrootSaga 来处理CHECKOUT_REQUEST 动作..

假设我在checkout1 中有function* checkout1() function* checkout2, function* checkout3,我想使用checkout2checkout3

function* checkout() {
  // query the state using the exported selector
  const cart = yield select(getCart)

  // ... call some API endpoint then dispatch a success/error action
}

export default function* rootSaga() {
  while (true) {
    yield take('CHECKOUT_REQUEST')
    yield fork(checkout)
  }
}

【问题讨论】:

  • “已经创建的传奇”是什么意思?你能再解释一下你的用例吗?
  • 所以你的问题是如何重用这种特殊类型的传奇:on action X: API request X -> success/error。我对吗?如果是这样,则可以创建一个工厂函数,该函数返回像 rootSaga 这样的 sagas,但使用自定义操作自定义 API 调用。

标签: redux redux-saga


【解决方案1】:

我假设你想从另一个生成器函数中生成一些生成器函数。

然后在你的函数* checkout1 中你可以产生另外两个生成器

function* checkout1 {
  try {
    yield call(checkout2)
    yield call(checkout3)
    yield put(successAction())
  } catch (error) {
    yield put(errorAction())
  }
}

或者你可以在两个 try-catch 块中做

function* checkout1 {
  try {
    yield call(checkout2)
    yield put(successAction1())
  } catch (error) {
    yield put(errorAction1())
  }

  try {
    yield call(checkout3)
    yield put(successAction2())
  } catch (error) {
    yield put(errorAction2())
  }
}

或您需要的任何其他组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2019-03-18
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 2018-06-18
    • 2017-01-28
    相关资源
    最近更新 更多