-
JS_PromiseTIL/프로그래머스 웹 데브코스 2021. 8. 14. 18:35728x90
Promise가 특별하게 callback과 다른 차이를 가지는 점은
than 메서드를 통해 결과를 꺼내 보는 것이 아니라!!
비동기 상황을 일급 값으로 다룬다는 점이 가장 중요한 차이이다.
프로미스는 프로미스라는 클래스를 통해서 만들어진 인스턴스를 반환한다.
그 프로미스라는 값은 대기, 성공, 실패를 다루는 일급 값으로 이루어져 있다는 게 핵심이다.
대기와 일을 끝내는 것들을 코드, 컨텍스트로 만! 다루는 게 아니라 대기되어지고 있다는 어떤 값을 만든다는 점에서 콜백과 가장 큰 차이를 가지며 이점이 정말 정말 정말 정말 핵심이다.
콜백
비동기적인 상황을 다루는것이 오직 코드로만 표현이 되며
function addCall(a, callback){ setTimeout(() => callback(a + 10), 100); } addCall(5, res => { addCall(res, res => { addCall(res, res => { console.log(res); }); }); });
프로미스
비동기 상황에 대한 값을 만들어서 리턴을 하고 있는 점이 정말 정말 중요한 차이이다.
function addPro(a) { return new Promise(resolve => setTimeout(() => resolve(a + 20), 100)); } addPro(5) .then(addPro) .then(addPro) .then(console.log);
즉!! AA 는 undefined 가 뜨며 어떠한 값이 나오지 않는 것이 반해
프로미스를 반환하는 addPro 의 결과인 BB는 프로미스라는 값이 나오는데 이점이 정말 정말 큰 차이이다.
let AA = addCall(5, res => { addCall(res, res => { addCall(res, res => { console.log(res); }); }); }); let BB = addPro(5) .then(addPro) .then(addPro) .then(console.log); console.log(AA); console.log(BB);
프로미스가 리턴되기 때문에 그 이후 프로미스 값을 이용할 수 있게 된다.
비동기로 일어난 상황을 값으로 다룰 수 있고 , 값으로 다룰 수 있다는 것은 그것이 일급이라는 의미이다.
비동기 상황이 값으로써 다루어질 수 있게 된다.
일급이라는 이야기는 변수에 할당될 수 있고,
어떤 함수에게 전달 될 수 있고
전달된 값을 가지고 계속해서 특정 작업을 이어나갈 수 있다는 것이 정말 정말 핵심이다!!
모나드
함수의 합성식을 모나드라 표현하기도 하는데, 먼저 함수의 합성이란 간단하게 아래와 같다.
f와 g라는 두 함수가 있고, X라는 인자를 g 함수가 받아 리턴하는 값을 f 함수가 그 결과를 만드는 것을 함수 합성이라 한다.
f, g f(g(x));
이렇게 연속적으로 함수를 합성할 때 상황에 따라 안전하게 합성할 수 있게 하기 위해, 모나드라는 개념이 있으며
비동기 상황을 안전하게 합성하기 위해 프로미스를 이용하며, 프로미스는 비동기적인 연속적인 함수 실행의 안전하게 할 수 있게 도와준다.
사실 자바스크립트에서는 모나드를 직접적으로 잘 사용하지는 않는다고 한다.
이유는 동적 타입의 언어로 타입을 중심적으로 사고하는 프로그래밍 언어는 아니기 때문이라 한다.
결국 모나드는 함수 합성을 안전하게 해주는 방법이자 도구이며 간단하게만 개념을 이해하고 넘어가도 좋다.
Kleisli Compostion
함수 합성 방법으로 오류가 있을 수 있는 상황에서의 함수 합성을 안전하게 할 수 있는 하나의 규칙이라고 표현할 수 있다. 다른 말로 클레이 슬리 애로우 (Kleisli Arrow)라고도 불린다.
들어오는 인자가 완전히 잘못된 인자여서 함수의 오류가 발생하는 상황이라던지
정확한 인자가 들어왔다 하더라도 외부 상태에 의해 정확한 결과를 전달하지 못하는 상황일 때의 에러를 해결하기 위한
함수 합성 방법이라 할 수 있겠다.
x라는 인자를 받아 g라는 값을 실행하였을 때 왼쪽 f 함수의 결과와 오른쪽 f 함수의 결과는 같아야 한다.
만약, x 인자의 문제라던지 외부 상태에 의해 g(x) 값이 올바르지 않은 결과가 나왔다면
f(g(x)) 한 값이 다른 값을 만들어내는 게 아니라, g(x) 값을 실행한 결과(에러)와 동일한 값이 만들어지는 규칙을 가진 합성법이라 할 수 있겠다.
f, g f(g(x)) = f(g(x)) f(g(x)) = g(x);
Promist.than의 중요한 규칙
than 메서드를 통해서 결과를 꺼냈을 때의 값이 반드시 Promise가 아니라는 점이다.
함수의 합성을 하는 경우 비동기적 로직과 동기적 로직을 함께 사용함으로써 굳이 동기적 로직이 비동기처럼 동작하는 경우가 있다.
이때, 불필요한 비동기적으로 자원을 낭비하는 상황이 발생하는데 이때는 함수 (또는 로직)등을 수정하여 비동기적 로직의 결과물인 Promis를 해결한 상태로 (Promise 객체가 아닌 상태) 다음 함수에 전달해야 하며 이러한 상황이 발생함을 신경 써서 비동기적 로직을 작성해야 한다.
즉 Promise로 비동기적 상황을 값으로 다루는 처리를 해주어 값이 프로미스 인지 아닌지 등의 예외를 처리하듯이 로직을 작성하면 좋다.
SUMMARY
Promise는 비동기 상황을 일급 값으로 다룬다는 점에서 콜백과 차이가 있다.
단지, than 메서드가 존재하여 이를 이용해 값을 꺼내보는 것이 차이가 아니라 비동기 상황을
콜백과 같이 코드로 다루는 것이 아닌, 값으로 다룰 수 있다는 점이 핵심이다.
728x90'TIL > 프로그래머스 웹 데브코스' 카테고리의 다른 글
JS_명령형 프로그래밍과 선언형 프로그래밍 (0) 2021.08.17 JS_잘 틀리는 예제 (0) 2021.08.16 JS_코드를 값으로 다루는 go, pipp, curry 함수 (0) 2021.08.12 JS_Virtual DOM (1) 2021.08.10 JS_제너레이터 (0) 2021.08.10