async function f1() {
return 1; // 값 반환
}
async function f2() {
return Promise.resolve(1); // 명시적 프로미스 반환
}
f1().then(alert); // 1
f2().then(alert); // 1
await 키워드를 프로미스 객체와 함께 사용하면 자바스크립트가 해당 프로미스가 resolve되어 fulfillment value를 리턴할때까지 “기다리도록” 만들 수 있다.
**async** function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("완료!"), 1000)
});
let result = **await** promise; // 프라미스가 이행될 때까지 기다림 (*)
alert(result); // "완료!"
}
f();
예를들어 위 코드에서 promise 앞에 await 키워드가 있기 때문에, 프로미스가 resolve 되어 결과 값을 반환할때까지 자바스크립트는 다음 줄로 넘어가지 않고 기다린다. (다음 줄의 alert이 바로 실행되지 않음)
만약 프로미스의 이행이 완료되면, 그때 결과값을 리턴한다. 따라서 result에는 1초 후에 “완료!” 라는 값이 담기게 되는 것이다.
await에 의해 프로미스가 처리되길 기다리는 동안에 JS 엔진은 여전히 다른 일(e.g. 다른 스크립트 실행, 이벤트 처리 등)을 할 수 있기 때문에 모든게 중단되고 CPU 리소스가 낭비되는 것은 아니라고 한다.
await는 반드시 async 안에서만 사용이 가능하다는 점을 유의하자.
await 역시 promise.then처럼 thenable 객체를 사용할 수 있다고 한다. 자세한 것은 여기 참고
Promise.all과도 함께 사용할 수 있다.
// 프라미스 처리 결과가 담긴 배열을 기다립니다.
let results = await Promise.all([
fetch(url1),
fetch(url2),
...
]);
async function showAvatar() {
// JSON 읽기
let response = await fetch('/article/promise-chaining/user.json');
let user = await response.json();
// github 사용자 정보 읽기
let githubResponse = await fetch(`https://api.github.com/users/${user.name}`);
let githubUser = await githubResponse.json();
// 아바타 보여주기
let img = document.createElement('img');
img.src = githubUser.avatar_url;
img.className = "promise-avatar-example";
document.body.append(img);
// 3초 대기
await new Promise((resolve, reject) => setTimeout(resolve, 3000));
img.remove();
return githubUser; // 해당 값을 결과값으로 가지는 프로미스를 리턴하게 된다.
}
showAvatar();