我们可以将 race 与 takeEvery 一起使用吗?

Can we use race with takeEvery ?

我正在使用 saga,我试图在 takeEvery 和超时之间实现竞争。如果用户没有执行某项操作,我想发送 DISMISS 操作(超时)。但如果用户已经完成了操作,我不想发送 DISMISS 操作。

我没有成功,所以我的问题是,我可以用 takeEvery 进行比赛吗?

const id = 5 // just for the example
const {a, b} = yield race({
  a: yield takeEvery(DISMISS, function* ({payload}) {
    if (payload === id) {
      // find a way to win the race
    }
    // continue to listen
  }),
  b: yield call(delay, 6000),
})

我找到了你不应该使用 takeEvery 而应该使用一段时间的正常调用的解决方案:

答案:

const {timeout} = yield race({
  _: call(yourFunction$, param),
  timeout: call(delay, alertDelay),
})

与:

function* yourFunction$(param) {
  let yourCond = true
  while (yourCond) {
   const action = yield take(YOUR_ACTION_TYPE)
   // do what you want 
  }
}