如何从回调链中删除突变?

时间:2017-10-09 07:45:20

标签: javascript callback functional-programming side-effects mutation

我试图用函数式编程来解决存储状态。

我写了一个既有突变又有副作用的函数;虽然,确实包括一些封装。如何通过函数式编程表示相同的功能?



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也不需要添加回调。

1 个答案:

答案 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"