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
가 콜백지옥
을 then
then
으로 푸는 걸로 설명되는 경향이 있는데 사실 Promise
는 일급
으로 비동기
를 다룬다는 큰 차이가 있다
Promise
는 대기/성공/실패 의 일급 값
을 반환하는데 이게 콜백
과 가장 큰 차이!!
- 이 점을 떠올릴 수 있느냐가 응용에 있어서 큰 차이를 만든다
Promise
는 비동기 상황
을 만들어서 리턴을 하는게 정말 큰 차이
비동기 상황
을 값
으로 다룰 수 있고 값으로 다룬다는건 일급
이라는 이야기고 일급
이라는건 변수에 할당 될수도 있고 전달될 수 도있고.. 이게 큰차이
[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]
안전하게 합성하는 방법 → 모나드 개념
- 컨테이너에 값이 들어있고 함수합성을 안전하게 하는것
- 자바스크립트는 모나드를 잘사용하지 않는다
- 동적인 언어에서 함수형을 할때는 모나드 개념을 잘 쓰지않는다
- Array나 Promise 상황에서 볼 수 있다
비동기적 상황을 안전하게 합성하는 모나드 → Promise