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 route 콜백이 호출되면 '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

내 자신의 환경 설정. 나는 함수가 항상 하나의 인터페이스만을 가져야한다고 생각한다. 그리고 항상 일반적인 경우를 사용하십시오. –