나중에 정리
- 그냥 동기처럼 프로미스가 처리 결과를 반환하도록 구현 가능.
- 기존 프로미스 생성 함수보다 간단하게 promise를 생성함
function fetchUser() { return new Promise((resolve, reject)=>{ resolve('hi'); }); } // async 함수 async function fetchUser() { return 'hi'; }
const user = fetchUser();
user.then(console.log);
console.log(user)
[[Prototype]]
:
Promise
[[PromiseState]]
:
"fulfilled"
[[PromiseResult]]
:
"hi"
>- async 사용
```js
// async 함수 선언문
async function foo(n) { return n; }
foo(1).then(v => console.log(v)); // 1
>
// async 함수 표현식
const bar = async function (n) { return n; };
bar(2).then(v => console.log(v)); // 2
>
// async 화살표 함수
const baz = async n => n;
baz(3).then(v => console.log(v)); // 3
>
// async 메서드
const obj = {
async foo(n) { return n; }
};
obj.foo(4).then(v => console.log(v)); // 4
>
// async 클래스 메서드
class MyClass {
async bar(n) { return n; }
}
const myClass = new MyClass();
myClass.bar(5).then(v => console.log(v)); // 5
다만 클래스의 컨스트럭터 메서드는 async 메서드가 될 수 없음.
컨스트럭터는 인스턴스를 반환하기 때문.
const fetch = require('node-fetch');
const getGithubUserName = async id => {
const res = await fetch(`https://api.github.com/users/${id}`); // ①
const { name } = await res.json(); // ②
console.log(name); // Ungmo Lee
};
getGithubUserName('ungmo2');
- fetch함수가 서버의 응답을 받아 반환한 프로미스가 settled 상태가 될 때까지 대기
- 이후 settled가 resolve한 처리 결과가 res에 할당
async function foo() {
const a = await new Promise(resolve => setTimeout(() => resolve(1), 3000));
const b = await new Promise(resolve => setTimeout(() => resolve(2), 2000));
const c = await new Promise(resolve => setTimeout(() => resolve(3), 1000));
console.log([a, b, c]); // [1, 2, 3]
}
foo(); // 약 6초 소요된다.
😽 올바른 사용
async function foo() { const res = await Promise.all([ new Promise(resolve => setTimeout(() => resolve(1), 3000)), new Promise(resolve => setTimeout(() => resolve(2), 2000)), new Promise(resolve => setTimeout(() => resolve(3), 1000)) ]); console.log(res); // [1, 2, 3] } foo(); // 약 3초 소요된다.
try {
setTimeout(() => { throw new Error('Error!'); }, 1000);
} catch (e) {
// 에러를 캐치하지 못한다
console.error('캐치한 에러', e);
}
const fetch = require('node-fetch');
const foo = async () => {
try {
const wrongUrl = 'https://wrong.url';
const response = await fetch(wrongUrl);
const data = await response.json();
console.log(data);
} catch (err) {
console.error(err); // TypeError: Failed to fetch
}
};
foo();
- async 함수 호출 후 발생한 에러를 캐치
const fetch = require('node-fetch'); const foo = async () => { const wrongUrl = 'https://wrong.url';
const response = await fetch(wrongUrl);
const data = await response.json();
return data;
};
foo()
.then(console.log)
.catch(console.error); // TypeError: Failed to fetch