async
는 ES8에 도입된, 비동기 처리 방법입니다.
프라미스를 반환하기 때문에, 프라미스를 잘 알아야 합니다.
async
는 함수 앞에 위치합니다.
async function f(){
return 1
}
함수 앞에 async
를 붙히면 해당 함수는 항상 프라미스를 반환합니다.
값을 반환할 때에도, 이행상태의 프라미스(resolved promise)로 감싸, 반환되게 합니다.
async function f(){
return 1
}
f()
.then(v=>alert(v)) // 1
async
는 이렇게 프라미스를 반환 하는 것 외에도 다른 기능을 제공합니다.
다른 키워드 await
는 async
안에서만 동작합니다.
await
는 async
함수 내에서만 동작합니다.
let value = await promise;
이처럼 사용합니다.
자바스크립트는 await
키워드를 만나면 프라미스가 처리될 때 까지 기다립니다.
async function f(){
let promise = new Promise(resolve => {
setTimeout(()=>resolve(1),1000)
})
let result = await promise; // promise 이행까지 기다림
}
await
는 말 그대로 프라미스가 처리될 때 까지 함수의 실행을 기다리게 만듭니다.
처리되면, 처리된 프라미스 객체의 result
를 반환합니다.
promise.then()
보다 좀 더 세련되게 프라미스의 result
를 얻을 수 있습니다.
async function showAvatar(id){
let response = await fetch(`xxx.com/users/${id}`);
let user = await response.json();
let img = document.createElement(img);
img.src = user.src;
append(img);
await new Promise(resolve=>setTimeout(resolve,1000) );
img.remove()
}
await
는 프라미스가 아니더라도thenalbe
객체를 받을 수 있습니다.
프라미스가 정상적으로 이행됐다면, await promise
는 프라미스 객체의 result
를 반환합니다.
반면, 거부되면 throw
문 처럼 에러가 던져집니다.
try..catch
를 통해 잡거나, async
함수가 거부상태가 되어, f().catch()
로 잡을 수 있습니다.