async functions - Lee-hyuna/33-js-concepts-kr GitHub Wiki
Javascriptμ Async/Await ν¨μ νꡬ
νλΌλ―Έμ€λ λΉλκΈ°μ μ½λλ₯Ό μμ°¨μ μΌλ‘ μ½κ² μ²λ¦¬νλ λ°©λ²μ μ 곡νλ€. μ°λ¦¬μ λκ° λΉλκΈ°μ±μ ν¨μ¨μ μΌλ‘ μ²λ¦¬νλλ‘ μ€κ³λμ§ μμλ€λ κ²μ κ³ λ €νλ©΄, λ§€μ° νμλ°μ λ§ν μΆκ°μ¬νμ΄λ€. Async / await ν¨μλ ES2017 ES8
) μ μλ‘μ΄ μΆκ° κΈ°λ₯μ΄λ€. λ΄λΆμ μΌλ‘ λΉλκΈ° μμ
μ μννλ©΄μ, νλ©΄μ μΌλ‘ μμ ν λκΈ°μ μ½λλ₯Ό μμ±ν μ μλλ‘ λμμ€λ€.
async
ν¨μλ₯Ό μ¬μ©νμ¬ μ»μ κΈ°λ₯μ νλΌλ―Έμ€
μ μ λλ μ΄ν°
λ₯Ό κ²°ν©νμ¬λ ꡬνν μ μμ§λ§ async
ν¨μλ μΆκ° μμ©κ΅¬ μ½λμμ΄ νμν κ²μ μ 곡νλ€.
κ°λ¨ν μμ
μλ μμ μμλ, λ¨Όμ 2 μ΄ νμ resolveλ‘ π€‘ κ°μ λκΈ°λ νλΌλ―Έμ€λ₯Ό λ°ννλ ν¨μλ₯Ό μ μΈνλ€. κ·Έλ° λ€μ async
ν¨μλ₯Ό μ μΈνλ€.
async
ν¨μλ λ©μμ§λ₯Ό μ½μμ λ‘κΉ
νκΈ° μ μ νλΌλ―Έμ€κ° reosolve λκΈ°κΉμ§ κΈ°λ€λ¦¬κΈ° μν΄ await
λ₯Ό μ¬μ©νλ€.
function scaryClown() {
return new Promise(resolve => {
setTimeout(() => {
resolve('π€‘');
}, 2000);
});
}
async function msg() {
const msg = await scaryClown();
console.log('Message:', msg);
}
msg(); // Message: π€‘ <-- after 2 seconds
awaitλ νλΌλ―Έμ€κ° resolveλκ±°λ reject λ λκΉμ§ κΈ°λ€λ¦¬λ λ° μ¬μ©λλ μλ‘μ΄ μ°μ°μμ΄λ€. async ν¨μ λ΄μμλ§ μ¬μ©ν μ μλ€.
μ¬λ¬ λ¨κ³κ° κ΄λ ¨λ κ²½μ° async ν¨μμ νμ΄ λ λΆλͺ ν΄μ§λ€.
function who() {
return new Promise(resolve => {
setTimeout(() => {
resolve('π€‘');
}, 200);
});
}
function what() {
return new Promise(resolve => {
setTimeout(() => {
resolve('lurks');
}, 300);
});
}
function where() {
return new Promise(resolve => {
setTimeout(() => {
resolve('in the shadows');
}, 500);
});
}
async function msg() {
const a = await who();
const b = await what();
const c = await where();
console.log(`${ a } ${ b } ${ c }`);
}
msg(); // π€‘ lurks in the shadows <-- after 1 second
μ£Όμ ν μ μ, μμ μμμ κ° λ¨κ³λ μμ°¨μ μΌλ‘ μνλλ©° κ° λ¨κ³κ° resolve, reject λ λκΉμ§ κΈ°λ€λ¦°λ€. λ¨κ³λ₯Ό λμμ μννλ €λ©΄ Promise.all
μ μ¬μ©νμ¬ λͺ¨λ νλΌλ―Έμ€κ° μ΄ν λ λκΉμ§ κΈ°λ€λ¦¬λ©΄ λλ€.
// ...
async function msg() {
// array destructuring
const [a, b, c] = await Promise.all([who(), what(), where()]);
console.log(`${ a } ${ b } ${ c }`);
}
msg(); // π€‘ lurks in the shadows <-- after 500ms
Promise.all
μ μ λ¬ λ λͺ¨λ νλΌλ―Έμ€κ° resolve λλ©΄ resolve λ κ°μ΄ μλ λ°°μ΄μ λ°ννλ€.
λν μμ μμ μμ μ½λλ₯Ό κ°κ²°νκ² λ§λ€κΈ° μν΄ array destructuring λ₯Ό μ¬μ©νλ€.
νλΌλ―Έμ€ λ°ν
Async ν¨μλ νμ νλΌλ―Έμ€λ₯Ό λ°ννκΈ°μ, μλ μ½λλ μνλ κ²°κ³Όλ₯Ό μ»μ§ λͺ»νλ€.
async function hello() {
return 'Hello Alligator!';
}
const b = hello();
console.log(b); // [object Promise] { ... }
λ°νλλ κ°μ νλΌλ―Έμ€μ΄κΈ° λλ¬Έμ, λμ λ€μκ³Ό κ°μ΄ ν μ μλ€.
async function hello() {
return 'Hello Alligator!';
}
const b = hello();
b.then(x => console.log(x)); // Hello Alligator!
λ¨μν λ³κ²½νλ©΄ μλμ κ°λ€.
async function hello() {
return 'Hello Alligator!';
}
hello().then(x => console.log(x)); // Hello Alligator!
λ€λ₯Έ λͺ¨μ
μ§κΈκΉμ§ μμ λ‘ async ν¨μλ₯Ό function μ μΈμΌλ‘λ§ νμ§λ§, νμ΄ν ν¨μλ‘λ μ μν μ μλ€.
ν¨μ ννμμΌλ‘ λ§λ async
ν¨μ ννμμΌλ‘ μ μλ 첫λ²μ§Έ μμ λ₯Ό 보μ.
const msg = async function() {
const msg = await scaryClown();
console.log('Message:', msg);
}
νμ΄ν ν¨μλ‘ λ§λ async
μ¬κΈ° λκ°μ μμ κ° λ λμ€μ§λ§ μ΄λ²μ νμ΄ν ν¨μλ‘ μ μνλ€.
const msg = async () => {
const msg = await scaryClown();
console.log('Message:', msg);
}
μλ¬ μ²λ¦¬
async ν¨μμ μ’μ μ μ try ... catch λ¬Έμ μ¬μ©νμ¬ μ€λ₯ μ²λ¦¬κ° μμ ν λκΈ°μ μΌλ‘ μνλλ€λ κ²μ΄λ€ . μ λ°μ rejectνλ νλΌλ―Έμ€λ₯Ό μ¬μ©νμ¬ μμ보μ.
function yayOrNay() {
return new Promise((resolve, reject) => {
const val = Math.round(Math.random() * 1); // 0 or 1, at random
val ? resolve('Lucky!!') : reject('Nope π ');
});
}
async function msg() {
try {
const msg = await yayOrNay();
console.log(msg);
} catch(err) {
console.log(err);
}
}
msg(); // Lucky!!
msg(); // Lucky!!
msg(); // Lucky!!
msg(); // Nope π
msg(); // Lucky!!
msg(); // Nope π
msg(); // Nope π
msg(); // Nope π
msg(); // Nope π
msg(); // Lucky!!
async ν¨μκ° νμ νλΌλ―Έμ€λ₯Ό λ°ννκΈ°μ catch
λ₯Ό μ¬μ©νμ¬ μ²λ¦¬λμ§ μμ μ€λ₯λ μ²λ¦¬ν μ μλ€.
async function msg() {
const msg = await yayOrNay();
console.log(msg);
}
msg().catch(x => console.log(x));
μ΄ μ€λ₯ μ²λ¦¬λ νλΌλ―Έμ€κ° reject λ λλΏλ§ μλλΌ μ€μ λ°νμ λλ ꡬ문 μ€λ₯κ° λ°μνλ κ²½μ°μλ μλνλ€. μλ μμ μμ msg
ν¨μλ₯Ό λλ²μ§Έ νΈμΆν λ νλ‘ν νμ
체μΈμ toUpperCase
λ©μλκ° μλnumber
κ°μ λκΈ΄λ€. tryβ¦ catch λΈλ‘μ κ·Έ μλ¬λ₯Ό μ‘μ λΈλ€ :
function caserUpper(val) {
return new Promise((resolve, reject) => {
resolve(val.toUpperCase());
});
}
async function msg(x) {
try {
const msg = await caserUpper(x);
console.log(msg);
} catch(err) {
console.log('Ohh no:', err.message);
}
}
msg('Hello'); // HELLO
msg(34); // Ohh no: val.toUpperCase is not a function
νλΌλ―Έμ€ κΈ°λ° APIλ₯Ό ν΅ν Async ν¨μ
Fetch API μ λ¬Έμμμ 보μ λ―μ΄, νλΌλ―Έμ€ κΈ°λ°μ μΉ APIλ async ν¨μμ μ μ΄μΈλ¦°λ€.
async function fetchUsers(endpoint) {
const res = await fetch(endpoint);
let data = await res.json();
data = data.map(user => user.username);
console.log(data);
}
fetchUsers('https://jsonplaceholder.typicode.com/users'); // ["Bret", "Antonette", "Samantha", "Karianne", "Kamren", "Leopoldo_Corkery", "Elwyn.Skiles", "Maxime_Nienow", "Delphine", "Moriah.Stanton"]