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

私の好みです。私は、関数は常に1つのインターフェースしか持たないと思う。そして、より一般的なケースを常に使用してください。 –

関連する問題