【问题标题】:How do I use yield inside a callback on redux-saga?如何在 redux-saga 的回调中使用 yield?
【发布时间】:2021-02-01 00:24:48
【问题描述】:

我有一个回调,我需要返回 true 或 false 来触发一些外部动作,我需要在这个回调中进行 API 调用,所以我需要在回调中获取状态并调度一些动作,我没有'不知道我是否可以使用 eventChannel,因为这个回调不能是生成器,只能是普通函数。我需要做这样的事情。

  zafClient.on('ticket.save', () => {
      const state = yield select();
      yield put(actionWithApiCall())

      // I need to wait for the action to finish and then return something 
      // based on the response from the API
      // I know how to block the saga to wait for the action dispatched 
      // the problem is that I can't use yield here

      return somethingfromthestore;
  });

顺便说一句,这是 zendesk API。

【问题讨论】:

    标签: javascript reactjs redux redux-saga zendesk


    【解决方案1】:

    您无法将生成器函数传递给该 API。解决方法是将一个动作直接发送到 redux 存储,然后编写一个监听该动作的 saga。

    zafClient.on('ticket.save', () => reduxStore.dispatch(actionWithApiCall()))
    

    您必须使 redux 存储可从您创建它的位置导出。这样你就可以直接在这里访问了。

    【讨论】:

    • 但是我如何等到 API 的响应在商店内,以便我可以根据更新的商店返回一些东西?
    • 使用yield take(MY_API_ACTION) 然后yield select() 在新的Saga 中从存储中获取数据
    【解决方案2】:

    其中一个挑战是如何在回调中yield。导入dispatch怎么样?不是dispatch非生成器版本的yield吗?

    如果您使用 React,这样做似乎是一种选择。

    在您用于指定回调的同一个 saga 中,您随后可以侦听在 dispatch/action creator 回调中创建的操作。这是通过指定另一个 watchFor 函数来完成的(在我的设置中,任意数量的导出的 watchFor 函数都会添加到 saga 观察者池中)。

    配对的 saga worker 可以在使用您的最终操作创建者通过更新存储来“记录”工作流程之前,最终确定从 API 调用返回的数据需要发生的任何事情。

    另一种选择可能是将 api 调用包装在 eventChannel 中(请参阅:https://github.com/redux-saga/redux-saga/issues/1178)。

    -E

    【讨论】:

      猜你喜欢
      • 2017-08-19
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      相关资源
      最近更新 更多