2020/03/11
first (function (data) {
... 먼저 실행할 작업 ...
second (function (data) {
... first 함수가 성공했을 때 실행할 작업 ...
third (function (data) {
... second 함수가 성공했을 때 실행할 작업 ...
fourth (function (data) {
... third 함수가 성공했을 때 실행할 작업 ...
}
}
}
})
이러한 콜백함수는 비동기 작업이 여러 번 이어지는 경우 콜백함수의 중첩이 많아져 하나의 함수가 너무 복잡하게 되는 경향이 있다. 이러한 문제를 콜백 지옥
이라고 한다.
이러한 문제를 해결하는 것이 Promise 객체
의 역할
ES6 부터 JavaScript의 표준 내장 객체로 추가.
console.log(Promise); // [Function: Promise]
new Promise(// executor라는 함수를 인자로 받는다.)
new Promise((resolve, reject)=>{...})
// Promise의 생성주기
// 1. Promise를 생성하게 되면 pending(대기) 상태
new Promise((resolve, reject)=>{...})
// 2. resolve 함수를 실행하게 되면, fulfilled(이행)상태
new Promise((resolve, reject)=>{
resolve();
})
// 3. reject 함수를 실행하게 되면, rejected(거부) 상태
new Promise((resolve, reject)=>{
reject();
})
new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, 1000);
});
// 변수
const prom = new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, 1000); // 1초 후에 resolve가 실행되면서 fulfilled상태가 된다.
});
// fulfilled 상태가 되는 시점에 then 안에 설정한 callback 함수 실행
prom.then(() => {
console.log('resolve된 이후에 실행'); // fulfilled 상태가 되고 나서 실행
});
// 함수
function func() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, 1000); // 1초 후에 resolve가 실행되면서 fulfilled상태가 된다.
});
}
// fulfilled 상태가 되는 시점에 then 안에 설정한 callback 함수 실행
func().then(() => {
console.log('이것도 resolve된 이후에 실행'); // fulfilled 상태가 되고 나서 실행
});
function func () {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject();
},1000)
})
}
func()
.then(() => {
console.log("이것도 resolve된 이후에 실행")
})
.catch(() => {
console.log("이것은 reject!!)
})
// resolve
function func() {
return new Promise((resolve, reject) => {
console.log('요시땅');
setTimeout(() => {
resolve('안녕 난 resolve라고 해~');
}, 1000);
});
}
func().then(message => {
console.log(message);
});
// reject
function func() {
return new Promise((resolve, reject) => {
console.log('요시땅');
setTimeout(() => {
reject('안녕 난 reject라고 해~');
}, 1000);
});
}
func().catch(message => {
console.log(message);
});
function func() {
return new Promise((resolve, reject) => {
console.log("요시땅");
setTimeout(() => {
reject(new Error("이유를 적어주세요");
}, 1000);
});
}
func()
.catch(error => {
console.log(error);
});
// Error: 이유를 적어주세요
// at Timeout._onTimeout //(c:\Users\Jotang\Desktop\blog\console\aaa.js:18:14)
// at listOnTimeout (internal/timers.js:531:17)
// at processTimers (internal/timers.js:475:7)
const func = () => {
return new Promise((resovle, reject) => {
const a = 1;
const b = 1;
console.log('자 실행합니다');
if (a === b) {
setTimeout(() => {
resovle('똑같습니다');
}, 1000);
} else {
setTimeout(() => {
reject(new Error('값이 다릅니다'));
}, 1000);
}
});
};
func()
.then(res => {
console.log(res);
})
.catch(err => {
console.log(err);
})
.finally(() => {
console.log('최종적으로 실행');
});
finally()
를 사용하여 fulfilled 또는 rejected 된 후에 최종적으로 실행할 것을 작성한다. finally의 인자로는 함수를 넣는다.function func() {
return new Promise((resolve, reject) => {
console.log('요시땅');
setTimeout(() => {
resolve('안녕 난 resolve라고 해~');
}, 1000);
});
}
func()
.then(() => {
return func();
})
.then(() => func())
.then(func)
.then(() => {
console.log('나는 4초후에 실행');
});
// 1초마다 요시땅이 console에 나오고,
// 마지막 4초후에는 "나는 4초후에 실행" 이 나오게 된다.
new Promise()
는 executor 함수를 인자로 받아 Promise객체를 생성하였지만, 이번에는 Promise.resolve()
를 이용한다.const a = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('promise');
}, 2000);
});
const b = 'value';
// 인자가 promise 객체인 경우
Promise.resolve(a).then(data => {
console.log('인자가 promise 객체인 경우', data);
});
// 인자가 promise 객체가 아닌 경우
Promise.resolve(b).then(data => {
console.log('인자가 promise 객체가 아닌 경우', data);
});
// 인자가 promise 객체가 아닌 경우 value -> 먼저 출력
// 인자가 promise 객체인 경우 promise -> 1초 후에 출력
Promise.reject(new Error('reject 되었슴둥'))
.then(err => {})
.catch(err => {
console.log(err);
});
function func(ms) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(ms);
}, ms);
});
}
Promise.all([func(1000), func(2000), func(3000), func(4000)]).then(mes => {
console.log('모두 fulfilled 된 이후에 실행', mes);
});
// 모두 fulfilled 된 이후에 실행 [ 1000, 2000, 3000, 4000 ]
function func(ms) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(ms);
}, ms);
});
}
Promise.race([func(1000), func(2000), func(3000), func(4000)]).then(data => {
console.log('제일 처음 fulfilled된 이후 실행', data);
});
// 제일 처음 fulfilled된 이후 실행 1000