์ ์ฌ์ฉํ์ง?
async ํจ์๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ํด ์ฌ์ฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ฝ๋๋ฅผ ์คํํ ๋, ์ด๋ค ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์๋ค.
async ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, ์ด๋ฌํ ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ๋จผ์ ์ฒ๋ฆฌํ ์ ์๋ค!
์ด๋ ๊ฒ ํ๋ฉด ํ๋ก๊ทธ๋จ์ ํจ์จ์ฑ์ด ๋์์ง๊ณ , ํนํ I/O ์์ ์ด๋ ๋คํธ์ํฌ ์์ฒญ ๊ฐ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์ ์์ ์ ์ฉํ๋ค.
async (์ด์ฑํฌ)ํจ์ ๋ฌธ๋ฒ
async๋ function ์์ ์์นํ๋ค.
async function f() {
return 1;
}
function ์์ async๋ฅผ ๋ถ์ด๋ฉด ํด๋น ํจ์๋ ํญ์ ํ๋ผ๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค. ํ๋ผ๋ฏธ์ค๊ฐ ์๋ ๊ฐ์ ๋ฐํํ๋๋ผ๋ ์ดํ ์ํ์ ํ๋ผ๋ฏธ์ค(resolved promise)๋ก ๊ฐ์ ๊ฐ์ธ ์ดํ๋ ํ๋ผ๋ฏธ์ค๊ฐ ๋ฐํ๋๋๋ก ํ๋ค.
์๋ ์์์ ํจ์๋ฅผ ํธ์ถํ๋ฉด result๊ฐ 1์ธ ์ดํ ํ๋ผ๋ฏธ์ค๊ฐ ๋ฐํ๋๋ค.
async function f() {
return 1;
}
f().then(alert); // 1
์๋์ฒ๋ผ ๋ช ์์ ์ผ๋ก ํ๋ผ๋ฏธ์ค๋ฅผ ๋ฐํํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฐ, ๊ฒฐ๊ณผ๋ ๋์ผํ๋ค.
async๊ฐ ๋ถ์ ํจ์๋ ๋ฐ๋์ ํ๋ผ๋ฏธ์ค๋ฅผ ๋ฐํํ๊ณ , ํ๋ผ๋ฏธ์ค๊ฐ ์๋ ๊ฒ์ ํ๋ผ๋ฏธ์ค๋ก ๊ฐ์ธ ๋ฐํํ๋ค.
โ๏ธasync๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ด๋ฟ๋ง์ด ์๋๋ค.
โ๏ธ๋ ๋ค๋ฅธ ํค์๋ await๋ async ํจ์ ์์์๋ง ๋์ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ await ํค์๋๋ฅผ ๋ง๋๋ฉด ํ๋ผ๋ฏธ์ค๊ฐ ์ฒ๋ฆฌ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
await๋ '๊ธฐ๋ค๋ฆฌ๋ค’๋ผ๋ ๋ป์ ๊ฐ์ง๊ณ ์๋๋ฐ, ์์ด ๋ป๋๋ก ๊ฒฐ๊ณผ๋ ๊ทธ ์ดํ ๋ฐํ๋๋ค.
1์ด ํ ์ดํ๋๋ ํ๋ผ๋ฏธ์ค๋ฅผ ์์๋ก ์ฌ์ฉํ์ฌ await๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํด๋ณด๋ฉด
async function f() {
let promise =newPromise((resolve, reject) => {
setTimeout(() => resolve("์๋ฃ!"), 1000)
});
let result = await promise; // ํ๋ผ๋ฏธ์ค๊ฐ ์ดํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ (*)
alert(result); // "์๋ฃ!"
}
f();
ํจ์๋ฅผ ํธ์ถํ๊ณ , ํจ์ ๋ณธ๋ฌธ์ด ์คํ๋๋ ๋์ค์ (*)๋ก ํ์ํ ์ค์์ ์คํ์ด ์ ์ '์ค๋จ’๋์๋ค๊ฐ ํ๋ผ๋ฏธ์ค๊ฐ ์ฒ๋ฆฌ๋๋ฉด ์คํ์ด ์ฌ๊ฐ๋๋ค.
์ด๋ ํ๋ผ๋ฏธ์ค ๊ฐ์ฒด์ result ๊ฐ์ด ๋ณ์ result์ ํ ๋น๋๋ค. ๋ฐ๋ผ์ ์ ์์๋ฅผ ์คํํ๋ฉด 1์ด ๋ค์ '์๋ฃ!'๊ฐ ์ถ๋ ฅ๋๋ค.
await๋ ๋ง ๊ทธ๋๋ก ํ๋ผ๋ฏธ์ค๊ฐ ์ฒ๋ฆฌ๋ ๋๊น์ง ํจ์ ์คํ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ง๋ ๋ค. ํ๋ผ๋ฏธ์ค๊ฐ ์ฒ๋ฆฌ๋๋ฉด ๊ทธ ๊ฒฐ๊ณผ์ ํจ๊ป ์คํ์ด ์ฌ๊ฐ๋์ฃ . ํ๋ผ๋ฏธ์ค๊ฐ ์ฒ๋ฆฌ๋๊ธธ ๊ธฐ๋ค๋ฆฌ๋ ๋์์ ์์ง์ด ๋ค๋ฅธ ์ผ(๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ, ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฑ)์ ํ ์ ์๊ธฐ ๋๋ฌธ์, CPU ๋ฆฌ์์ค๊ฐ ๋ญ๋น๋์ง ์๋๋ค.
async ํจ์๊ฐ ์๋๋ฐ await์ ์ฌ์ฉํ๋ฉด ๋ฌธ๋ฒ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
function f() {
let promise = Promise.resolve(1);
let result = await promise; // Syntax error
}
function ์์ async๋ฅผ ๋ถ์ด์ง ์์ผ๋ฉด ์ด๋ฐ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์์ ์ค๋ช ํ ๊ฒ๊ณผ ๊ฐ์ด await๋ async ํจ์ ์์์๋ง ๋์ํ๋ค.
โ๏ธ์ฃผ์ํด์ผ ํ ์
// ์ต์์ ๋ ๋ฒจ ์ฝ๋์์ ๋ฌธ๋ฒ ์๋ฌ๊ฐ ๋ฐ์ํจ
let response = await fetch('/article/promise-chaining/user.json');
let user = await response.json();
ํ์ง๋ง ์ต๋ช async ํจ์๋ก ์ฝ๋๋ฅผ ๊ฐ์ธ๋ฉด ์ต์์ ๋ ๋ฒจ ์ฝ๋์๋ await๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
(async () => {
let response = await fetch('/article/promise-chaining/user.json');
let user = await response.json();
...
})();
๐ ์ถ๊ฐ ์ ๋ณด
promise.then์ฒ๋ผ await์๋ thenable ๊ฐ์ฒด(then ๋ฉ์๋๊ฐ ์๋ ํธ์ถ ๊ฐ๋ฅํ ๊ฐ์ฒด)๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
thenable ๊ฐ์ฒด๋ ์๋ํํฐ ๊ฐ์ฒด๊ฐ ํ๋ผ๋ฏธ์ค๊ฐ ์๋์ง๋ง ํ๋ผ๋ฏธ์ค์ ํธํ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ ์ ์๋ค๋ ์ ์์ ์๊ธด ๊ธฐ๋ฅ์ ๋๋ค. ์๋ํํฐ์์ ๋ฐ์ ๊ฐ์ฒด๊ฐ .then์ ์ง์ํ๋ฉด ์ด ๊ฐ์ฒด๋ฅผ await์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
("์๋ํํฐ์์ ๋ฐ์ ๊ฐ์ฒด"๋ผ๋ ๊ฒ์ ๋น์ ์ด ๋ง๋ ์ฝ๋๊ฐ ์๋ ์ธ๋ถ์์ ์ ๊ณต๋ ์ฝ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๋ฌ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๊ฐ์ฒด๊ฐ .then ๋ฉ์๋๋ฅผ ์ง์ํ๋ค๋ฉด, ์ด ๊ฐ์ฒด๋ฅผ await์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๋ป์ ๋๋ค.)
await๋ ํด๋์ค Thenable์ ์ธ์คํด์ค๋ฅผ ๋ฐ์ ์ ์๋ค.
lass Thenable {
constructor(num) {
this.num = num;
}
then(resolve, reject) {
alert(resolve);
// 1000๋ฐ๋ฆฌ์ด ํ์ ์ดํ๋จ(result๋ this.num*2)
setTimeout(() => resolve(this.num * 2), 1000); // (*)
}
};
async function f() {
// 1์ด ํ, ๋ณ์ result๋ 2๊ฐ ๋จ
let result = await new Thenable(1);
alert(result);
}
f();
: ๋ฉ์๋ ์ด๋ฆ ์์ async๋ฅผ ์ถ๊ฐํ๋ฉด async ํด๋์ค ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๋ค.
class Waiter {
async wait() {
return await Promise.resolve(1);
}
}
new Waiter()
.wait()
.then(alert); // 1
async ๋ฉ์๋์ async ํจ์๋ ํ๋ผ๋ฏธ์ค๋ฅผ ๋ฐํํ๊ณ await๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์์ ๋์ผํ๋ค.
์ฐธ๊ณ ์๋ฃ
async์ await
ko.javascript.info
'23. Front-end > 23. html css javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Callback ๊ณผ Promise ์ฐจ์ด ์์๋ณด๊ธฐ, Promise ์ฌ์ฉํ๊ธฐ (ํ ์ค ๋ธ๋ก๊ทธ ์ฐธ๊ณ ) (3) | 2024.07.24 |
---|---|
data-***, data-์์ฑ๋ช , ์ฌ์ฉ์ ์ ์ ์์ฑ (0) | 2022.03.18 |
[Javascript] Function ํจ์, Event (0) | 2022.03.03 |
[JavaScript 2]BOM and DOM, Element ์ ํ, Class ์ ํ์ ๋ฐฐ์ด ,innerHTML, innerTEXT (0) | 2022.03.02 |
JavaScript (0) | 2022.03.02 |