Await/Async 에 대한 무성한 소문만 들어왔던 나.. 마음먹고 Await/Async에 대해 공부하기로 했다!
사실 내가 설명하는 것 보다 공식 문서를 읽는게 빠르다. 이 글은 단지 내가 읽은 것을 (이해할 수 있는 범위에서, 간단히) 정리하고 복습하기 위한 용도이다.
한마디로 Await/Async는 비동기 코드를 동기적으로 처리하기 위한 방법이다.
공식 문서 링크: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
동기는 하나의 일이 끝나야 다음 일을 수행하는 방식을, 비동기는 다른 일이 끝나는 것과는 상관 없이 다음 일을 수행하는 방식을 의미한다. JavaScript는 기본적으로 비동기방식을 사용한다.
본격적으로 Await/Async에 대해 이해하기 위해 Callbacks, Promise를 먼저 알아보자.
function myDisplayer(something) {
document.getElementById("demo").innerHTML = something;
}
function myCalculator(num1, num2, myCallback) {
let sum = num1 + num2;
myCallback(sum);
}
myCalculator(5, 5, myDisplayer);
myCalculator()에서 myDisplayer를 인자로 호출하고 있다 → sum 기능이 완료된 후 myDisplayer()가 실행된다.
setTimeout(myFunction, 3000);
function myFunction() {
document.getElementById("demo").innerHTML = "I love You !!";
}
실행 결과: 3초 뒤에 “I love You”가 출력된다.
function myDisplayer(some) {
document.getElementById("demo").innerHTML = some;
}
let myPromise = new Promise(function(myResolve, myReject) {
let x = 0;
// The producing code (this may take some time)
if (x == 0) {
myResolve("OK");
} else {
myReject("Error");
}
});
myPromise.then(
function(value) {myDisplayer(value);},
function(error) {myDisplayer(error);}
);
myPromise.then() 부분에서 myPromise의 producing code가 실행되고 나면 resolve와 reject 결과를 출력한다.
async function myDisplay() {
let myPromise = new Promise(function(resolve, reject) {
resolve("I love You !!");
});
document.getElementById("demo").innerHTML = await myPromise;
}
myDisplay();
await을 통해 myPromise를 wait하고, async를 통해 myPromise를 return한다.