redux-saga采用正则表达式

时间:2016-06-19 14:33:22

标签: javascript ecmascript-6 redux redux-saga

我正在使用redux-saga作为我的网络应用,但是我想要能够创建一个处理多个不同请求的saga类型。为了做到这一点,我希望能够将taketakeEvery与reg-ex一起使用。例如:

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

所有这些都应该通过以下方式处理:

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

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

3 个答案:

答案 0 :(得分:9)

您可以使用

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

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

正如@lukehedger所指出的那样:github issue

检查文档:take(pattern)

答案 1 :(得分:2)

答案 2 :(得分: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)
}