我试图用函数式编程来解决存储状态。
我写了一个既有突变又有副作用的函数;虽然,确实包括一些封装。如何通过函数式编程表示相同的功能?
const createCallbackChain = () => {
let callbacks = []
const addCallback = callback => (
callbacks
.push(callback)
)
const triggerCallbacks = data => (
callbacks
.forEach(callback => callback(data))
)
return (
Object.freeze({
addCallback,
triggerCallbacks,
})
)
}
const callbackChain = createCallbackChain()
callbackChain.addCallback(() => console.log('Hello'))
callbackChain.addCallback(() => console.log('World!'))
callbackChain.triggerCallbacks()

我的目标是能够在不同时间调用addCallback
并根据需要多次触发所有回调。 removeCallback
之后不需要trigger
也不需要添加回调。
答案 0 :(得分:1)
您需要创建处理特定数据的函数。您的案例中的回调数组。我们可以在没有闭包的情况下编写函数,并将我们的回调作为参数传递。
const triggerCallbacks = (callbacks, data) => callbacks
.forEach(callback => callback(data));
const addCallback = (callbacks, callback) => callbacks.concat([callback]);
const calbackChainDefault = [];
const withHelloCallback = addCallback(calbackChainDefault, () => console.log('Hello'));
const withWorldCallback = addCallback(withHelloCallback, () => console.log('World!'));
triggerCallbacks(withHelloCallback, null); //print "Hello"
triggerCallbacks(withWorldCallback, null); //print "Hello World"