RezKesh Asked: 2025-04-29 19:15:29 +0800 CST2025-04-29 19:15:29 +0800 CST 2025-04-29 19:15:29 +0800 CST 如何在 Redux Saga 中创建 takeOne 效果创建器? 772 我想要一个 Redux Saga 效果创建器,它只接受模式中第一个已调度的 action,而忽略其余的。我该如何创建它?例如,Saga文档解释了如何takeEvery创建它。我会在我的应用中运行的 Saga 函数中写一些类似的东西: function* mySaga() { takeOne("one_time_action", someSaga); } redux 2 个回答 Voted Best Answer Ori Drori 2025-04-30T03:58:16+08:002025-04-30T03:58:16+08:00 用来yield take()等待patternOrChannel,然后调用fork你想要调用的 saga。本质上它takeEvery没有循环: const takeOne = (patternOrChannel, saga, ...args) => fork(function*() { const action = yield take(patternOrChannel) yield fork(saga, ...args.concat(action)) }) RezKesh 2025-04-30T18:28:20+08:002025-04-30T18:28:20+08:00 以下是该解决方案的 TypeScript 版本: import { take, fork, ForkEffect, ActionPattern } from "@redux-saga/core/effects"; import { SagaIterator } from "redux-saga"; export function takeOne<A extends { type: string }>( pattern: ActionPattern<A>, saga: (action: A, ...args: any[]) => Generator | SagaIterator, ...args: any[] ): ForkEffect { return fork(function* () { const action: A = yield take(pattern); yield fork(saga, action, ...args); }); }
用来
yield take()
等待patternOrChannel
,然后调用fork
你想要调用的 saga。本质上它takeEvery
没有循环:以下是该解决方案的 TypeScript 版本: