【问题标题】:How i can do this with functional programming?我怎么能用函数式编程做到这一点?
【发布时间】:2019-06-01 13:15:59
【问题描述】:

关于函数式编程,当我要使用 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))
}  
}

如何更好地使用选项?

【问题讨论】:

  • FP 声明状态是不可变的。如果您没有对对象应用任何更改,那么返回对象的副本是没有意义的。这是对CPU的浪费。只需返回一个未更改的对象。

标签: javascript redux functional-programming redux-saga


【解决方案1】:

如果你在谈论函数式编程中的数据不变性,你不必为你的例子创建一个浅拷贝对象,假设 removeSerieSuccess getSeries 等应该是纯的(或者至少不变异 serie 得到通过)。

当你看到有时人们在传递给其他函数(如在 redux reducer不必要的重新渲染。但实际上 redux 实际上并不要求 reducer 是纯的,但鼓励它具有更好的可预测性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多