ReduxObservable 取消基于动作类型及其数据
ReduxObservable cancellation based on action type and its data
我有 React 应用程序,它使用 redux-observable 和 typescript。在这种情况下,FetchAttribute 操作会被一个 id 触发,然后进行 ajax 调用。
在某些情况下,如果 "FETCH_ATTRIBUTE_CANCEL" 操作使用与 "FetchAttributeAction" 操作相同的 ID 触发,我想取消 ajax 请求。
action$.ofType(FETCH_ATTRIBUTE)
.switchMap((request: FetchAttributeAction) => {
return ajax.getJSON(`/api/fetch-attribute?id=${request.id}`)
.flatMap((fetchUrl) => {
// return new action
})
.takeUntil(action$.ofType(FETCH_ATTRIBUTE_CANCEL));
});
interface FetchAttributeAction{
id: number;
}
问题:
我们如何取消基于动作类型+动作数据的执行?
在我的例子中,它将 FETCH_ATTRIBUTE_CANCEL 和 id.
我认为您应该能够使用 pluck 和 filter 使 takeUntil 对某个动作 ID 具有选择性。
例如:
.takeUntil(action%.ofType(FETCH_ATTRIBUTE_CANCEL)
.pluck('id')
.filter((cancelActionID) => cancelActionID === fetchID))
对我来说不明显的部分是如何将当前的 fetchID 与 运行 进行比较。我可能会考虑尝试使用 do 存储在一个临时变量
关键是将 takeUntil
通知程序中的操作过滤为仅与您关心的 ID 匹配的操作。
action$.ofType(FETCH_ATTRIBUTE_CANCEL).filter(action => action.id === request.id)
它可能是这样的:
演示:https://stackblitz.com/edit/redux-observable-playground-xztkoo?file=fetchAttribute.js
const fetchAttributeEpic = action$ =>
action$.ofType(FETCH_ATTRIBUTE)
.mergeMap(request =>
ajax.getJSON(`/api/fetch-attribute?id=${request.id}`)
.map(response => fetchAttributeFulfilled(response))
.takeUntil(
action$.ofType(FETCH_ATTRIBUTE_CANCEL).filter(action => action.id === request.id)
)
);
你也可以看看之前的问题:
OP 还指出他们正在使用 switchMap
(就像我最初复制他们的代码时一样)这意味着史诗自 [=13= 以来一次只有一个 getJSON ] 将取消订阅之前的内部 Observables。所以这也需要被链接起来。抓得好!
我有 React 应用程序,它使用 redux-observable 和 typescript。在这种情况下,FetchAttribute 操作会被一个 id 触发,然后进行 ajax 调用。 在某些情况下,如果 "FETCH_ATTRIBUTE_CANCEL" 操作使用与 "FetchAttributeAction" 操作相同的 ID 触发,我想取消 ajax 请求。
action$.ofType(FETCH_ATTRIBUTE)
.switchMap((request: FetchAttributeAction) => {
return ajax.getJSON(`/api/fetch-attribute?id=${request.id}`)
.flatMap((fetchUrl) => {
// return new action
})
.takeUntil(action$.ofType(FETCH_ATTRIBUTE_CANCEL));
});
interface FetchAttributeAction{
id: number;
}
问题: 我们如何取消基于动作类型+动作数据的执行? 在我的例子中,它将 FETCH_ATTRIBUTE_CANCEL 和 id.
我认为您应该能够使用 pluck 和 filter 使 takeUntil 对某个动作 ID 具有选择性。
例如:
.takeUntil(action%.ofType(FETCH_ATTRIBUTE_CANCEL)
.pluck('id')
.filter((cancelActionID) => cancelActionID === fetchID))
对我来说不明显的部分是如何将当前的 fetchID 与 运行 进行比较。我可能会考虑尝试使用 do 存储在一个临时变量
关键是将 takeUntil
通知程序中的操作过滤为仅与您关心的 ID 匹配的操作。
action$.ofType(FETCH_ATTRIBUTE_CANCEL).filter(action => action.id === request.id)
它可能是这样的:
演示:https://stackblitz.com/edit/redux-observable-playground-xztkoo?file=fetchAttribute.js
const fetchAttributeEpic = action$ =>
action$.ofType(FETCH_ATTRIBUTE)
.mergeMap(request =>
ajax.getJSON(`/api/fetch-attribute?id=${request.id}`)
.map(response => fetchAttributeFulfilled(response))
.takeUntil(
action$.ofType(FETCH_ATTRIBUTE_CANCEL).filter(action => action.id === request.id)
)
);
你也可以看看之前的问题:
OP 还指出他们正在使用 switchMap
(就像我最初复制他们的代码时一样)这意味着史诗自 [=13= 以来一次只有一个 getJSON ] 将取消订阅之前的内部 Observables。所以这也需要被链接起来。抓得好!