从 redux-saga 获取回调

Getting callbacks from redux-saga

我正在使用 Dispatch 触发 saga 中的一个函数。 Saga 可以在完成所有工作后向我发送组件内部的信息吗?其实,我会用一个简单的例子来解释我想做什么,请不要笑,我确定这行不通。

dispatch({
  type: 'triggerApiCallInSaga'
}).then(res => doSomething(res.payload));

我想根据我所做的查询对组件进行更改。我实际上想用 redux 来维护它,但我担心我的状态会扩大。另外,通过 redux 检查以关闭模式对我来说似乎很愚蠢。

简而言之,我想从 saga 接收信号并在组件中查看它。我可以为它做一个听众吗?或者 saga 有这个方法吗?尽管我进行了搜索,但找不到正确的结果。 redux-sagas callback (aka sagas and setState)我遇到了和我的问题类似的问题,但是这里遇到了我看不懂的否定答案。

谢谢。

您链接的答案是正确的,传奇与组件通信的预期方式是通过更新 redux 存储。添加 promises/callbacks 是一种反模式,因为每个动作都可以由 0-n sagas 处理——当然你可能知道在你的情况下它只是一个 saga,但框架不能以任何方式保证这一点,所以它以后可能会导致一些意想不到的问题。

也就是说,即使它是反模式并不意味着您不能这样做。

更简单的方法是向操作添加回调,例如

// component
const callback = data => console.log(data)
dispatch({type: MY_ACTION, callback})

// saga
yield takeEvery(MY_ACTION, function*(action) {
  action.callback({foo: 'bar'});
})

如果您更喜欢 promises,那是仅靠 saga 库无法轻松完成的事情,但是有一些包可以添加此功能,例如: https://github.com/adobe/redux-saga-promise

这个问题的理想解决方案是 运行 在 useReducer 钩子之上创建一个 saga,这样你就可以使用组件状态而不是将特定于组件的状态添加到 redux 存储.有一些尝试这样做,但不幸的是 react is still missing some functionality 这将使我们能够可靠地做到这一点而不会引入其他问题。