본문 바로가기
JavaScript

[FP&ES6+] 일급 값으로의 Promise 활용

by _sweep 2022. 1. 3.

함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다.

 

 

✏️ 예제

 

const go1 = (a, f) => f(a);
const add5 = (a) => a + 5;
console.log(go1(10, add5));

// output
// 15

 

go1 함수는 값과 함수를 인자로 받아 함수에 값을 적용한 결과를 단순 리턴하는 함수이다.

go1 함수가 제대로 동작하려면 다음과 같은 전제 조건이 필요하다.

  1. 인자로 주어지는 함수 f가 동기적으로 동작해야 한다.
  2. 인자로 주어지는 값 a가 동기적으로 바로 값을 알 수 있는 값이어야 한다.

즉, go1 함수의 인자로 비동기 상황이 일어난 값이 아닌(Promise가 아닌) 값이 들어와야 정상적으로 원하는 결과를 얻을 수 있다.

 

console.log(go1(Promise.resolve(10), add5));

// output
// [object Promise]5

 

이처럼 10이라는 값이 시간이 걸린 후에 알 수 있는 값이라면(Promise라면) 콘솔 로그 결과에 보이는 대로 원하는 결과를 얻을 수 없다.

 

const delay100 = (a) =>
  new Promise((resolve) => setTimeout(() => resolve(a), 100));

console.log(go1(delay100(10), add5));

// output
// [object Promise]5

 

이를 더 자세히 알아보기 위해 delay100이라는 함수를 만들었다.

delay100은 100ms 이후에 받아두었던 값 a를 그대로 리턴하는 동작을 하는 함수이다.

delay100처럼 비동기적으로 시간이 지난 후 값을 알 수 있는 값이 go1의 인자로 주어지자 원하는 결과를 얻을 수 없다.

 

 

const go1 = (a, f) => (a instanceof Promise ? a.then(f) : f(a));
console.log(go1(delay100(10), add5));

let result = go1(delay100(10), add5);
result.then(console.log);

// output
// Promise {<pending>}
// 15

 

비동기적인 값을 이용해 동기적으로 작동하는 것처럼 원하는 결과를 얻기 위해서 go1 함수를 변형시켰다.

인자로 들어온 값 a가 Promise 값이라면 then 함수를 이용해 인자로 받은 함수 f를 적용하고

Promise 값이 아니라면 함수 f를 즉시 a에 적용한다.

 

a가 Promise 값이라면 go1을 적용한 값도 Promise 값이 된다.

그리고 이것을 다시 then 함수를 이용해 콘솔 로그를 찍으면 원하던 결과를 얻을 수 있다.

이는 Promise가 일급 값으로 다루어지기 때문에 가능한 일이다.

 

const n1 = 10;
go1(go1(n1, add5), console.log);

const n2 = delay100(10);
go1(go1(n2, add5), console.log);

// output
// 15
// 15

 

값을 즉시 적용하는 것과 비동기로 적용하는 것을 보기 쉽게 정리한 모습이다.

둘 다 원하는 값을 제대로 얻어온 것을 확인할 수 있다.

 

 

++

 

instanceof

instanceof 연산자는 객체의 prototype chain에 생성자의 prototype이 존재하는지 판별한다.

 

object instanceof constructor
  • object : 판별할 객체
  • constructor : 판별 목표 함수

 

 

 

 

 

댓글