10

我正在使用redux-saga我的网络应用程序,但是我已经达到了一个点,即我希望能够创建一个saga处理多种不同请求类型的单一应用程序。为了做到这一点,我希望能够使用taketakeEvery使用正则表达式。例如:

'foo/SOME_REQUEST'
'bar/SOME_REQUEST'
'baz/SOME_REQUEST'

都应该通过这样的方式来处理:

yield takeEvery('*/SOME_REQUEST', handler);

有谁知道这是否可能或如何实现?

4

3 回答 3

12

您可以使用

yield takeLatest( action => /SOME_REQUEST$/.test(action.type), handler)

或者

yield take( action => /SOME_REQUEST$/.test(action.type))

正如@lukehedger 在这里指出的那样:github问题

检查文档:take(pattern)

于 2016-10-19T11:16:35.670 回答
2

这是一个示例代码。

演示: http: //kuy.github.io/redux-saga-examples/takex.html
GitHub:https ://github.com/kuy/redux-saga-examples/tree/master/takex

于 2016-06-22T08:27:24.343 回答
1

您需要使用自定义效果。

 //effect.js
    
 export const takeEveryRegex = (pattern, saga, ...args) =>
  fork(function* () {
    while (true) {
      const action = yield take("*")
      if (pattern.test(action.type)) {
        yield fork(saga, ...args.concat(action))
      }
    }
  })

然后在你的传奇中,按照正常模式使用它。

//saga.js    

function* formFailureSaga({ payload, action }) {
  yield console.log("form failure SAGA", payload, action)
}
    
export function* watchFormFailureSaga() {
  yield takeEveryRegex(/^FAILURE[/s/S]*((?=.*FORM))/, formFailureSaga)
}
于 2021-04-08T03:23:52.223 回答