비동기 작업이 중첩되는 경우 관리가 힘들어지고 이를 콜백헬이라고 부른다.
promise는 비동기작업의 상태를 알기 위한 객체이다.
.then은 promise 이후의 동작을 수행하는 메서드이다.
promise와 then을 사용해 콜백헬 문제를 극복할 수 있다.
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("완료!"), 1000);
});
promise.then(result => {
console.log(result);
}, error => {
console.log(error); });
// 결과값
// Promise {<pending>}
// 완료상태
프라미스 객체의 상태값
then은 promise chaining 에서 유용하게 사용된다.
주의할 점은 연산이 순차적으로 연결되는 경우에 chain구조라는 점을 기억해야 한다.
new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 1000); // (*)
}).then(function(result) { // (**)
alert(result); // 1
return result * 2;
}).then(function(result) { // (***)
alert(result); // 2
return result * 2;
}).then(function(result) {
alert(result); // 4
return result * 2;
});
async는 함수 앞에 붙여 항상 프라미스를 반환한다.
await는 async와 한 쌍으로 사용해, async함수가 프라미스를 반환할 때 까지 기다린 후 다음 작업을 수행한다.
async와 await를 사용하면 가독성이 좋다.
async function myFunc(){
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("완료!"), 1000);
});
console.log(promise); // 결과값은 <pending>
let result = await promise; // pormise가 끝날 때 까지 기다린다.
console.log(promise);
console.log(result); // <fulfilled>와 '완료!' 가 출력된다.