1

我試圖圍繞函數式編程來存儲狀態。如何從回調鏈中刪除突變?

我寫了一個兼有突變和副作用的函數;雖然,確實包括一些封裝。我如何用函數式編程來表示這個相同的功能?

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

看起來有點像一個窮人的承諾或可觀察。 – Bergi

+0

沒有副作用的回調是無用的,除非你讓'triggerCallback'返回它們的結果值並讓調用者以某種方式使用它。 – Bergi

+0

我實際上試圖捕獲Observable create函數,並在調用匹配的Express路由回調時調用'observer.next'。我直接從我的中間件模塊中導出'triggerCallbacks'函數。 – Sawtaytoes

回答

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" 
+0

如果您對函數式編程感興趣,請關注Sunctuary.JS或Rmada.JS庫。 –

+0

JavaScript'.concat()'可以使用函數並將其添加到數組的末尾。你不需要包裝它。 – Sawtaytoes

+0

這是我自己的偏好。我認爲功能總是應該只有一個接口。並始終使用更常見的情況。 –