Promise


[일급으로 비동기 상황 다루기]

/*
	기존 Callback 형태로 비동기
*/

function add10(a, callback) {
  setTimeout(() => callback(a + 10), 100);
}

// 연속 연산시 복잡
var a = add10(5, res => {
  add10(res, res => {
    add10(res, res => {
      // log(res);
    });
  });
});

// log(a); // undefined
// 이후의 상황 다룰수 없다

/*
  Promsie 형태로 비동기
*/

function add20(a) {
  return new Promise(resolve => setTimeout(() => resolve(a + 20), 100));
}
// 비동기 상황을 만들어서 리턴을 하는게 정말 큰 차이
// 프로미스 리턴이 중요하다

// 연속 연산도 심플하게 가능
var b = add20(5)
  .then(add20)
  .then(add20)
// .then(log);

// log(b);// Promise(pending) // 상황이 리턴되어 있다
// 이로인해 이후의 상황을 다룰 수 있다

어떻게 결과를 꺼내어 보는가가 이슈가 아니다

[Promise의 일급 성질 활용 방법]

Promise 미적용시

const add5 = a => a + 5;

const go2 = (a, f) => f(a);
log(go2(10, add5)); // 15
// Promise가 아닌 값이 잘 들어와야 처리되는 로직
// 10이 어느정도 시간이 지난 후 알수있다면 연산이 불가능

Promise 적용시

const add5 = a => a + 5;

const delay100 = a => new Promise(resolve =>
  setTimeout(() => resolve(a), 100));
// 100 ms 후에 받은 값을 리턴하는 함수

const go1 = (a, f) => a instanceof Promise ? a.then(f) : f(a);
// 바로 들어올때나 딜레이로 들어올때나 둘다 결과 만들 수 있도록 적용

const n1 = 10;
go1(go1(n1, add5), log); // 15
log(go1(go1(n1, add5), log)); // undefined

const n2 = delay100(10);
go1(go1(n2, add5), log); // 15
log(go1(go1(n2, add5), log)); // Promise pending

[Composition]

안전하게 합성하는 방법 → 모나드 개념

비동기적 상황을 안전하게 합성하는 모나드 → Promise