首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当多个组件使用Saga时取消Saga

当多个组件使用Saga时取消Saga
EN

Stack Overflow用户
提问于 2021-01-28 06:45:28
回答 2查看 33关注 0票数 0

我一直在努力解决这个问题,做了一些研究,打破了我的头,但我仍然没有解决这个问题。

所以我有一个React + Redux应用程序。在某些情况下,应用程序呈现多个相同的组件

代码语言:javascript
复制
return (
  <MyComponent id={1} path={path} />
  <MyComponent id={2} path={path} />
  <MyComponent id={3} path={path} />
)

在这里,MyComponent连接到redux并使用Saga进行API调用。我尝试实现一种机制,以便能够取消这些API请求,如下所示:

代码语言:javascript
复制
export function* watchMyRequest(action) {
  const task = yield fork(getRequestSaga, action);
  yield take(RESET_REQUEST_DATA);
  yield cancel(task);
}

每次path更改时,我都会为RESET_REQUEST_DATA发送一个操作,这应该会取消我的saga。问题是,由于我有多个相同的组件,它们都将调用cancel操作。

我的问题是,我如何才能使用Sagas来调用特定的取消?

EN

回答 2

Stack Overflow用户

发布于 2021-01-28 07:54:58

如果您有相同的操作类型,则需要使用操作对象的其他部分来区分不同的实例。例如,在示例的React部分中,您为每个组件提供了一个id。您可以将此id作为监视/重置操作的一部分,然后使用take(fn) api侦听特定的id。

代码语言:javascript
复制
function* watchMyRequest(action) {
  const task = yield fork(getRequestSaga, action);
  yield take(a => a.type === RESET_REQUEST_DATA && a.id === action.id);
  yield cancel(task);
}

你可以在这里看到它的工作原理:https://codesandbox.io/s/gyhlg?file=/src/index.js

票数 1
EN

Stack Overflow用户

发布于 2021-01-29 21:17:23

感谢@Martin-Kadlec,我想出了类似他的答案:

代码语言:javascript
复制
export function* watchMyRequest(action) {
  const task = yield fork(getRequestSaga, action);
  yield take(`${RESET_REQUEST_DATA}_${action.payload.id}`);
  yield cancel(task);
}

这样,我们就可以独立地区分每个操作,并随时取消它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65928541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档