我目前在一个项目上使用redux-saga,并且我想使用它来防止多次请求相同的资源。
此刻,我在同一页面上有多个组件在请求资源(即调度{types: "REQUEST_POST_COMMENTS", postId: <postIdHere>}
)
我有这个传奇:
export function* loadPostComments() {
yield takeLatest("REQUEST_POST_COMMENTS", loadPostComments);
}
我的页面同时调度以下操作:
{types: "REQUEST_POST_COMMENTS", postId: 123}
{types: "REQUEST_POST_COMMENTS", postId: 321}
{types: "REQUEST_POST_COMMENTS", postId: 123}
我的目标是让loadPostComments
被调用两次,一次被称为123,而一次被称为321。
在测试版中,我已切换到takeLeading
-但这只会调用一次loadPostComments
。
除了通过takeLatest
值将action.type
分组的模式以外,是否可以使用模式定义传奇?还是通过任何类似的方式实现?
答案 0 :(得分:0)
您必须将遇到的postId
和以下内容保存到它们:
function* watchRequestPostComments() {
const encounteredPostIds = new Set()
while(true) {
const { postId } = yield take('REQUEST_POST_COMMENTS')
if (!encounteredPostIds.has(postId) {
yield fork(loadPostComments, postId)
}
encounteredPostIds.add(postId)
}
}
似乎没有特定的redux-saga-esque方式来执行此操作。无论如何,您都必须跟踪这些ID。
我已经回答了有关throttling requests的类似问题。
附言::这看起来像是无休止的递归。必须是无意的名称冲突:
export function* loadPostComments() {
yield takeLatest("REQUEST_POST_COMMENTS", loadPostComments)
}