: function 앞에 async를 붙이면 해당 함수는 항상 Promise를 반환하는 비동기 처리 함수가 됨
function hello(){
return 'hello';
}
async function helloAsync(){
return 'hello async!';
}
console.log(hello()); // hello
console.log(helloAsync()); // Promise {<pending>}
// Promise를 반환하기 때문에, .then()을 사용하여 결과값을 받아볼 수 있음
helloAsync().then((res)=>{
console.log(`결과 : ${res}`);
}); // 결과 : hello async!
async function getName(){
throw new Error('err...');
}
getName().then((res)=>{
console.log(`성공 : ${res}`);
}).catch((err)=>{
console.log(`실패 : ${err}`);
});
// 실패 : Error: err...
: 프로미스가 처리될 때까지 함수 실행을 기다리게 만들고, 프로미스가 처리되면 그 결과와 함께 실행함.
await 키워드는 async 키워드가 있는 함수 내에서만 사용 가능
자바스크립트는 await 키워드를 만나면 프로미스가 처리될 때까지 기다림
async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("완료!"), 2000);
});
let result = await promise; // 프라미스가 이행될 때까지 기다림
console.log(result); // "완료!"
}
f();
// ms는 받아서 해당 시간만큼 대기했다가 종료되는 비동기 함수
function delay(ms) {
return new Promise((resolve) => {
// 딱히 실패가 없기때문에 reject는 사용하지 않음
// setTimeout(()=>{
// resolve();
// }, 3000);
// setTimeout 내 콜백함수 안에 resolve를 호출하는게 다면, callback함수 자체를 resolve로 전달하는 것도 가능
setTimeout(resolve, ms);
});
}
async function helloAsync() {
return delay(3000).then(() => {
return "hello async";
});
}
helloAsync().then((res) => {
console.log(`결과 : ${res}`);
});
- delay 함수 내에서 new Promise((resolve)=>{setTimeout(resolve, ms)})는 while(true) 와 같이 성공했다는 신호를 보내는 역할임.
- delay() 함수가 실행되면 new Promise(()=>{setTimeout( ,ms)})가 반환됨
- helloAsync() 함수 내에서 delay(3000)은 그냥 3초를 기다리는 함수임.
- helloAsync()가 실행되면 그냥 3초를 기다린 후 그 결과값으로 hello async를 리턴하는것임
- helloAsync()의 결과를 .then메소드에서 res로 받아서 출력해 주는 것임
/*
async function helloAsync() {
return delay(3000).then(() => {
return "hello async";
});
}
*/
async function helloAsync() {
await delay(3000);
return 'hello async';
}
- await 키워드를 비동기함수 호출 앞에 추가하면 비동기함수가 동기적인 함수처럼 작동하게됨
- await 키워드가 붙은 함수의 호출은 뒤 함수가 끝나기 전까지 아래 코드를 수행하지 않는다. ( = await 줄은 동기적으로 수행됨.)
function delay(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function helloAsync() {
await delay(3000);
return "hello async";
}
async function main() {
const res = await helloAsync();
console.log(res);
}
main();