我如何使用函数式编程做到这一点?

时间:2019-01-06 18:54:02

标签: javascript redux functional-programming redux-saga

关于函数式编程,当我打算使用sagas删除一个序列时,为action.serie生成一个新的对象是否正确,即使您不打算更改操纵的对象也是如此?

export function* removeSerie(action){
try{
    const user = yield new Promise(resolve => {
        const unsub = auth.onAuthStateChanged(user => {
          if (user) {
            resolve(user)
            unsub()
          }
        })
    })
    const url = `users/${user.id}/series/${actio.serie.genre}/${action.serie.id}`
    yield database.ref(url).remove()
    yield put(ActionCreator.removeSerieSuccess(action.serie.id))
    yield getSeries(action.serie.genre)
}catch({message}){
    yield put(ActionCreator.removeSerieFailure(message))
}  
}
               or

export function* removeSerie(action){
const serie = {...action.serie}  //action.serie is the serie passed for remove, with id, name, genre...
try{
    const user = yield new Promise(resolve => {
        const unsub = auth.onAuthStateChanged(user => {
          if (user) {
            resolve(user)
            unsub()
          }
        })
    })
    const idUser = user.uid  //is necessary do this?
    const url = `users/${idUser}/series/${serie.genre}/${serie.id}`
    yield database.ref(url).remove()
    yield put(ActionCreator.removeSerieSuccess(serie.id))
    yield getSeries(serie.genre)
}catch({message}){
    yield put(ActionCreator.removeSerieFailure(message))
}  
}

如何更好地使用选项?

1 个答案:

答案 0 :(得分:0)

如果您正在谈论函数式编程中的数据不变性,则无需为示例创建浅表复制对象,而假设removeSerieSuccess getSeries等应为纯(或至少不更改{ {1}}通过了。

并且当您看到有时人们在传递给redux reducer之类的其他功能之前先进行浅表复制,因为它更易于检测更改,您可以通过引用进行检查,这些更改在使用激进{{1 }},以避免不必要的重新呈现。但是,实际上redux实际上并不需要要求减速器是纯净的,但是它被鼓励具有更好的可预测性。