
Callback은 함수 실행 후 다시 호출되는 함수로, 비동기 작업 완료시 호출될 수 있습니다. 하지만 중첩될 경우 콜백 지옥 문제를 일으킬 수 있습니다.
Promise는 비동기 작업의 성공, 실패를 처리하는 객체로, Callback보다 가독성이 좋고 체인 형식으로 작업을 이어나갈 수 있습니다.
then, catch, finally를 사용해 비동기 작업의 흐름을 제어할 수 있습니다.
자바스크립트에는 setTimeout() 이라는 대표적인 내장 비동기 함수가 있다. setTimeout()은 두 개의 매개 변수를 받는데, 첫번째는 실행할 작업 내용을 담은 콜백 함수이고, 두 번째는 이 콜백 함수를 수행하기 전에 기다리는 밀리초 단위 시간이다.
즉, setTimeout() 함수는 두번째 인자로 들어온 시간만큼 기다린 후에 첫 번째 인자로 들어온 콜백 함수를 실행한다.
function async(callback) {
setTimeout(() => {
callback("waited 1 sec.");
}, 1000);
}
async(function (msg) {
console.log(msg);
});
따라서 위 코드를 실행하면 1초 뒤에 "waited 1 sec."이 콘솔에 찍힌다. 이렇게 어떠한 비동기 로직이 완료되었을 때 callback 함수를 실행시킴으로써 callback에서 작성한 어떠한 행동을 실행할 수 있게 된다.
resolve는 성공했을 때, reject는 에러가 발생했을 때 첫 번째 인자로 어떠한 값을 넘길 수 있다.function async(key) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (key === true) resolve("waited 1 sec.");
else reject(new Error("Error!"))
}, 1000);
})
}
async(true)
.then((result) => { console.log(result); })
.catch((error) => { console.log(error); });
function async(id, callback) {
setTimeout(function () {
console.log("waited 1 sec.");
const user = {
id: id,
name: "User" + id,
email: id + "@test.com",
};
callback(user);
}, 1000);
}
async(1, function (user) {
console.log("user:", user);
});
// waited 1 sec.
// user: {id: 1, name: "User1", email: "1@test.com"}
function async(result, callback) {
setTimeout(() => {
callback(result, function (result) {
console.log(result);
});
}, 1000);
}
async(0, function (res, callback) {
callback(res)
async(res + 1, function (res, callback) {
callback(res)
async(res + 1, function (res, callback) {
callback(res)
});
});
});
// 0
// 1
// 2
function async(result) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(result);
resolve(result);
}, 1000)
});
}
async(0).then(res => {
return async(res + 1);
}).then(res => {
return async(res + 1);
})
// 0
// 1
// 2
// 보다 더 간결하고 이해하기 쉬운 것을 알 수 있다!