Promise ( ES6 )
동기 : 순차적으로 실행
비동기 : 병렬적으로 실행 ()
1. 비동기 처리의 예
- setTimeout
- addEventLitener
- XMLHttpRequest
1 2 3 4 5
| console.log("1"); setTimeout(function() { console.log("2"); }, 0); console.log("3");
|
콘솔 창에는 1 , 3 , 2 가 찍힌다!
=> 비동기 처리의 실행 순서를 제어하기 위해 콜백함수 중첩 실행
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function hell(callback) { setTimeout(function() { callback(); }, 1000); }
hell(function() { console.log("1");
hell(function() { console.log("2");
hell(function() { console.log("3"); }); }); });
|
콜백 헬 : 콜백함수를 여러개 중첩하면 작업 내용 이해가 어려움! 에러시 예외 처리가 어려움!
2. Promise
- 콜백 헬를 해결할 수 있다!
- 비동기 처리를 동기적으로 처리하기 위한 라이브러리
- Promise에서 비동기 처리를 실행하고, 그 처리가 끝난 후 다음 처리를 실행할 수 있게 한다!(resolve, reject)
1. Promise 객체 생성
var promise = new Promise( resolve, reject ) { ... }
- Promise를 종료시키는 콜백함수
- resolve : 함수 안의 처리가 성공적으로 끝났을 때 호출되는 콜백함수
- reject : 함수 안의 처리가 실패했을 때 호출되는 콜백함수
2. resolve 함수 + then 메서드
- resolve 함수의 인수 값은 then 메서드에 인수로 전달되어 처리한다.
3. reject 함수 + catch 메서드
- reject 함수의 인수 값은 catch 메서드에 인수로 전달되어 처리한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| var promise = new Promise(resolve, reject){ setTimeout(function(){ var num = parseInt(prompt("5미만의 숫자 입력"))
if(num <= 5){ resolve(num) } else { reject(`숫자 ${num}은 오류입니다. 5미만으로 입력해주세요.`) } }, 1000) }
promise .then( funtion(num){ console.log(num) }) .catch({ function(err){ console.log(err) } })
|
catch 메서드 대신 .then에 두번째 인자로 사용할 수 있다!
4. Promise의 콜백함수에 새로운 인수 넣기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
function buy(money) { return new Promise(function(res, rej) { var pay = parseInt(prompt("지불할 금액")); var balance = money - pay;
if (balance > 0) { res(balance); } else { rej(`잔액은 ${money}입니다. 구매할 수 없습니다.`); } }); }
buy(500) .then(function(balance) { console.log(`잔액은 ${balance}입니다.`); }) .catch(function(err) { console.log(err); });
|
5. Promise.all 메서드
- Primise.all 안의 모든 비동기 처리가 성공적으로 끝나야 Promise가 종료되고 다음 작업이 이루어진다!
Promise.all([Array])
- resolve : Array의 value가 담긴 response 배열을 받음
- reject : 가장 먼저 실패한 reject 함수의 인수를 받음
1 2 3 4 5 6 7
| Promise.all([ new Promise(resolve => setTimeout(() => resolve(1), 3000)), new Promise(resolve => setTimeout(() => resolve(2), 2000)), new Promise(resolve => setTimeout(() => resolve(3), 1000)) ]) .then(console.log) .catch(console.log);
|
3초 뒤에 resolved [ 1, 2, 3 ]
6. Promise.race 메서드
- 가장 먼저 종료한 Promise 객체의 결과만 반환
Promise.race([Array])
- resolve : 가장 먼저 종료된 value만 받음
- reject : 가장 먼저 실패한 reject 함수의 인수를 받음
1 2 3 4 5 6 7
| Promise.race([ new Promise(resolve => setTimeout(() => resolve(1), 3000)), new Promise(resolve => setTimeout(() => resolve(2), 2000)), new Promise(resolve => setTimeout(() => resolve(3), 1000)) ]) .then(console.log) .catch(console.log);
|
1초 뒤에 resolved 3