Promise 객체
node.js 공부하다가 promise 객체에 대해 잘 모른다는걸 알게되어 정리하게 됨
Promise 객체 ; 자바스크립트에서 비동기 처리를 위해 사용되는 객체.
이벤트 리스너를 사용할 때 콜백함수를 자주 사용하지만 ES2015부터는 자바스크립트와 노드의 API들이 콜백대신 프로미스기반으로 재구성됨
1
2
3
4
5
6
7
8
9
10
|
console.log('A');
const promise = new Promise((resolve)=>{
resolve('B');
});
console.log('C');
promise.then(console.log);
//A -> C -> B 순 출력
|
cs |
프로미스 ; 실행은 바로 하되 결과값은 나중에 받는 객체
new Promise 가 실행은 바로 되지만 결과값은 then이 붙였을때 받게됨
promise 내부에서 resolve가 호출되면 then이 실행됨
resolve에 넣어준 인수 'B'는 then 의 매개변수가 됨, 즉 'B'가 console.log의 인수가 되게 됨
Promise 객체를 생성하고, then() 메소드를 사용하여 Promise 객체가 Fulfilled(성공) 상태일 때의 처리를 수행하는 예시 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
const myPromise = new Promise((resolve, reject) => {
// 비동기 작업 수행
let success = true; // 비동기 작업이 성공했는지 여부
if (success) {
// 비동기 작업이 성공했을 경우 resolve 함수 호출
const result = '작업이 성공적으로 완료되었습니다.';
resolve(result);
} else {
// 비동기 작업이 실패했을 경우 reject 함수 호출
const error = '작업이 실패하였습니다.';
reject(error);
}
});
myPromise.then(result => {
console.log(result);
})
.catch(error => {
console.error(error);
});
|
cs |
위 코드에서는 Promise 객체가 Fulfilled 상태가 되므로, then() 메소드에 전달한 콜백 함수가 실행되어 result 변수에 resolve 함수에서 전달한 '작업이 성공적으로 완료되었습니다.' 문자열이 할당되고, console.log()를 통해 콘솔에 출력됨
*promise 내부는 동기 , then을 만나는 순간 비동기가 되어 백그라운드에 전달됨
*백그라운드 가는애 = setTimeout, console.log('hi')
*같은 비동기여도 프로미스가 setTimeout 보다 먼저 출력됨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
function oneMore(){
console.log('one more');
}
const promise = new Promise((resolve)=>{
resolve('hi');
});
function run(){
console.log('run run');
setTimeout(()=>{
console.log('wow');
},0)
promise.then(console.log);
oneMore();
console.log('min is ..')
}
setTimeout(run,5000);
//5 초 뒤 run run -> one more -> min is... -> hi -> wow 순 출력
|
cs |
5 초 뒤 run run -> one more -> min is... -> hi -> wow 순 출력됨