await
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2017ë 3ì.
* Some parts of this feature may have varying levels of support.
await ì°ì°ìë Promiseê° ì´íë ëê¹ì§ ì´íë ê°ì ë°íë°ë ë° ì¬ì©ë©ëë¤. ì´ ì°ì°ìë ë¹ë기 í¨ì ë´ë¶ë 모ë ìµìë¨ ë¶ë¶ììë§ ì¬ì©í ì ììµëë¤.
구문
await expression
매ê°ë³ì
expression-
Promise, thenable ê°ì²´ ëë ë기í ì ìë ê°.
ë°í ê°
íë¡ë¯¸ì¤ ëë thenable ê°ì²´ì ì´í ê°ì´ê±°ë, ííìì´ thenableì´ ìë ê²½ì° í´ë¹ ííìì ìì²´ ê°.
ìì¸
íë¡ë¯¸ì¤ ëë thenable ê°ì²´ê° ê±°ë¶ëë©´, í´ë¹ ê±°ë¶ ì¬ì 를 ëì§ëë¤.
ì¤ëª
awaitë ì¼ë°ì ì¼ë¡ Promise를 ííìì¼ë¡ ì ë¬íì¬ í´ë¹ íë¡ë¯¸ì¤ë¥¼ ì¸ë©íë ë° ì¬ì©ë©ëë¤. await를 ì¬ì©íë©´ í´ë¹ íë¡ë¯¸ì¤ê° ì´í ëë ê±°ë¶ ì²ë¦¬ë ëê¹ì§ async í¨ìì ì¤íì´ ì¼ì ì¤ë¨ë©ëë¤. íë¡ë¯¸ì¤ê° ì´íëë©´ ì¤íì´ ì¬ê°ëê³ , await ííìì ê°ì ì´íë íë¡ë¯¸ì¤ ê°ì´ ë©ëë¤.
íë¡ë¯¸ì¤ê° ê±°ë¶ëë©´, await ííìì ê±°ë¶ë ê°ì ëì§ëë¤. await ííìì í¬í¨íë í¨ìë ì¤ë¥ì ì¤í í¸ë ì´ì¤ì íìë©ëë¤. ë°ë©´, ê±°ë¶ë íë¡ë¯¸ì¤ë¥¼ await íì§ ìê±°ë ì¦ì ë°ííë©´ í¸ì¶ í¨ìë ì¤í í¸ë ì´ì¤ì ëíëì§ ììµëë¤.
expressionì Promise.resolve()ì ëì¼í ë°©ìì¼ë¡ ì²ë¦¬ë©ëë¤. íì 기본 Promiseë¡ ë³íí ë¤, ìì를 기ë¤ë¦½ëë¤. expressionì ë¤ìê³¼ ê°ì ê°ì¼ ì ììµëë¤.
- 기본
Promise:expressionì´Promiseëë íì í´ëì¤ì ìíê³expression.constructor === Promiseì´ë©´, í´ë¹ íë¡ë¯¸ì¤ëthen()ì í¸ì¶íì§ ìê³ ì§ì ì¬ì©ëì´ await ë©ëë¤. - Thenable ê°ì²´: ë¹ë´ì¥ íë¡ë¯¸ì¤, í´ë¦¬í, íë¡ì, íì í´ëì¤ ë±ì í¬í¨í í´ë¹ ê°ì²´ì
then()ë©ìë를 í¸ì¶íë©´ìresolveì½ë°±ì í¸ì¶íë ì²ë¦¬ê¸°ë¥¼ ì ë¬íì¬, 기본Promise()ìì±ìë¡ ìë¡ì´ íë¡ë¯¸ì¤ë¥¼ 구ì±í©ëë¤. - thenable ìë ê°: ì´ë¯¸ ì´íë
Promiseë¡ ëíëì´ ì¬ì©ë©ëë¤.
íë¡ë¯¸ì¤ê° ì´ë¯¸ ì´íë ê²½ì°ìë, ë¹ë기 í¨ì ì¤íì ë¤ì í±ê¹ì§ ì¼ì ì¤ë¨ë©ëë¤. ê·¸ ì¬ì´ì í´ë¹ ë¹ë기 í¨ì를 í¸ì¶í ê³³ììë ì¤íì´ ê³ì ì§íë©ëë¤. ìëìì ìì 를 ì°¸ê³ íì¸ì.
awaitë ë¹ë기 í¨ìë 모ë ë´ë¶ììë§ ì¬ì©í ì ìì¼ë©°, ì´ë¤ì ë¹ë기ì ì´ê³ íë¡ë¯¸ì¤ë¥¼ ë°íí©ëë¤. ë°ë¼ì await ííìì ë©ì¸ ì¤ë ë를 ì°¨ë¨íì§ ìì¼ë©°, ê²°ê³¼ì ìì¡´íë ì½ëë§ ì¤íì ì§ì°ìíµëë¤. ì¦, await ííì ì´íì ì½ëë§ì´ ìí¥ì ë°ìµëë¤.
ìì
>ì´íë íë¡ë¯¸ì¤ 기ë¤ë¦¬ê¸°
Promiseê° await ííìì ì ë¬ëë©´, í´ë¹ Promiseê° ì´íë ëê¹ì§ 기ë¤ë¦° ë¤ ì´íë ê°ì ë°íí©ëë¤.
function resolveAfter2Seconds(x) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
async function f1() {
const x = await resolveAfter2Seconds(10);
console.log(x); // 10
}
f1();
Thenable ê°ì²´
Thenable ê°ì²´ë ì¤ì Promise ê°ì²´ì ëì¼í ë°©ìì¼ë¡ ì²ë¦¬ë©ëë¤.
async function f2() {
const thenable = {
then(resolve) {
resolve("resolved!");
},
};
console.log(await thenable); // "resolved!"
}
f2();
ê±°ë¶ë ìë ììµëë¤.
async function f2() {
const thenable = {
then(_, reject) {
reject(new Error("rejected!"));
},
};
await thenable; // Throws Error: rejected!
}
f2();
íë¡ë¯¸ì¤ ë³íí기
ê°ì´ Promiseê° ìë ê²½ì°, awaitë í´ë¹ ê°ì ì´íë Promiseë¡ ë³ííê³ ê¸°ë¤ë¦½ëë¤. ì´ë then ìì±ì´ í¸ì¶ ê°ë¥í ííê° ìëë¼ë©´, í´ë¹ ê° ìì²´ë ë³íì§ ììµëë¤.
async function f3() {
const y = await 20;
console.log(y); // 20
const obj = {};
console.log((await obj) === obj); // true
}
f3();
ê±°ë¶ë íë¡ë¯¸ì¤ ì²ë¦¬í기
Promiseê° ê±°ë¶ë ê²½ì°, ê±°ë¶ë ê°ì ëì ¸ì§ëë¤.
async function f4() {
try {
const z = await Promise.reject(30);
} catch (e) {
console.error(e); // 30
}
}
f4();
ê±°ë¶ë íë¡ë¯¸ì¤ë await í기 ì ì catch() ì²ë¦¬ê¸°ë¥¼ ì²´ì´ë íì¬ try ë¸ë¡ ìì´ ì²ë¦¬í ì ììµëë¤.
const response = await promisedFunction().catch((err) => {
console.error(err);
return "default response";
});
// íë¡ë¯¸ì¤ê° ê±°ë¶ëë©´ ìëµì "default response"ê° ë©ëë¤.
ì´ë promisedFunction()ì´ ë기ì ì¼ë¡ ì¤ë¥ë¥¼ ëì§ì§ ìê³ , íì ê±°ë¶ë íë¡ë¯¸ì¤ë¥¼ ë°ííë¤ë ì ì ì 기ë°í©ëë¤. ëë¶ë¶ì ì ì íê² ì¤ê³ë íë¡ë¯¸ì¤ ê¸°ë° í¨ìë¤ì ì´ì ê°ì í¹ì±ì ê°ì§ë©°, ì¼ë°ì ì¼ë¡ ë¤ìê³¼ ê°ì ííë¡ ìì±ë©ëë¤.
function promisedFunction() {
// ì¤ë¥ê° ë°ìí ê°ë¥ì±ì ì¤ì´ê¸° ìí´ íë¡ë¯¸ì¤ë¥¼ ì¦ì ë°íí©ëë¤.
return new Promise((resolve, reject) => {
// ë¹ë기 ìì
ìí
});
}
íì§ë§, promisedFunction()ì´ ë기ì ì¼ë¡ ì¤ë¥ë¥¼ ëì§ë ê²½ì°, catch() ì²ë¦¬ê¸°ë¡ë ì¤ë¥ë¥¼ í¬ì°©í ì ììµëë¤. ì´ë¬í ê²½ì°ìë try...catch ë¬¸ì´ íìí©ëë¤.
ìµìì await
await í¤ìëë ë¹ë기 í¨ì ì¸ë¶ì 모ëì ìµìììì ì¬ì©í ì ììµëë¤. ì´ë await를 ì¬ì©íë íì 모ëì´ ìì ê²½ì°, í´ë¹ 모ëì´ ì¤íë기 ì ì íì 모ë ì¤íì 기ë¤ë¦¬ê² í¨ì ì미í©ëë¤. ì´ ê³¼ì ìì ë¤ë¥¸ íì 모ëì ë¡ë©ì ì°¨ë¨ëì§ ììµëë¤.
Fetch API를 ì¬ì©íê³ export문 ë´ìì await를 ëª
ìí 모ëì ìì ì
ëë¤. ì´ ëª¨ëì ê°ì ¸ì¤ë ë¤ë¥¸ 모ëì ì´ë¤ ì½ëë ì¤íë기 ì ì í´ë¹ í¨ì¹ ì´íì 기ë¤ë¦½ëë¤.
// fetch ìì²
const colors = fetch("../data/colors.json").then((response) => response.json());
export default await colors;
awaitê° ì ì´ íë¦ì 미ì¹ë ìí¥
ë¹ë기 í¨ìë 모ëìì await를 ë§ëë©´, í´ë¹ await ííìì ì¦ì ì¤íëë©° ê·¸ ê°ì ìì¡´íë ëë¨¸ì§ ì½ëë ì¼ì ì¤ë¨ë©ëë¤. ì¤í íë¦ì í¨ììì ë¹ ì ¸ëì í¸ì¶ììê² ë°íë©ëë¤. await ííìì ê°ì´ ì´íëë©´, ì¤ë¨ë ì½ë를 ì¤íí기 ìí ë ë¤ë¥¸ ë§ì´í¬ë¡íì¤í¬ê° ì¤ì¼ì¤ì ë±ë¡ë©ëë¤. ì´ë await ê°ì´ ì´ë¯¸ ì´íë íë¡ë¯¸ì¤ì´ê±°ë íë¡ë¯¸ì¤ê° ìë ê²½ì°ìë ë§ì°¬ê°ì§ì
ëë¤. ì´ë¬í ê²½ì°, íì¬ í¨ìë ì´ë¯¸ ìì½ë 모ë ë§ì´í¬ë¡íì¤í¬ê° ì²ë¦¬ë기 ì ê¹ì§ ë¤ì ì¤íëì§ ììµëë¤. ë¤ì ì½ë를 ì´í´ë³´ì¸ì.
async function foo(name) {
console.log(name, "start");
console.log(name, "middle");
console.log(name, "end");
}
foo("First");
foo("Second");
// First start
// First middle
// First end
// Second start
// Second middle
// Second end
ì´ë¬í ê²½ì°, foo í¨ìë await ííì í¬í¨íì§ ì기 ë문ì ë기ì ì¼ë¡ ëìí©ëë¤. ì¸ ë¬¸ì¥ ëª¨ë ëì¼í í±ìì ëìí©ëë¤. ë°ë¼ì, ë í¨ì í¸ì¶ì 모ë 문ì¥ì ìì°¨ì ì¼ë¡ ì¤ííê² ë©ëë¤. íë¡ë¯¸ì¤ ê´ì ìì ë³´ë©´, ì´ í¨ìë ë¤ìê³¼ ê°ì´ ííí ì ììµëë¤.
function foo(name) {
return new Promise((resolve) => {
console.log(name, "start");
console.log(name, "middle");
console.log(name, "end");
resolve();
});
}
íì§ë§ awaitê° íëë¼ë í¬í¨ëë©´, í´ë¹ í¨ìë ë¹ëê¸°ê° ëë©° ì´í 문ì¥ë¤ì ì¤íì ë¤ì í±ì¼ë¡ ì°ê¸°ë©ëë¤.
async function foo(name) {
console.log(name, "start");
await console.log(name, "middle");
console.log(name, "end");
}
foo("First");
foo("Second");
// First start
// First middle
// Second start
// Second middle
// First end
// Second end
ì´ë ë¤ìê³¼ ê°ì ì½ëê° ë ì ììµëë¤.
function foo(name) {
return new Promise((resolve) => {
console.log(name, "start");
resolve(console.log(name, "middle"));
}).then(() => {
console.log(name, "end");
});
}
ì¶ê°ë then() ì²ë¦¬ê¸°ë ì´ë¤ ë¹ë기 ëìë 기ë¤ë¦¬ì§ ì기 ë문ì ìì±ìì ì ë¬ëë ì¤í기ì ë³í©ë ì ììµëë¤. ê·¸ë¬ë, ì´ ì²ë¦¬ê¸°ê° ì¡´ì¬í¨ì¼ë¡ì¨ foo를 í ë² í¸ì¶í ëë§ë¤ ì¶ê°ì ì¸ ë§ì´í¬ë¡íì¤í¬ê° ìì±ëì´ ì½ëê° ë¶í ë©ëë¤. ì´ë¬í ë§ì´í¬ë¡íì¤í¬ë ì½í ë°©ìì¼ë¡ ë±ë¡ëê³ ì¤íëì´, ì½ë ì§í ìë를 ëë¦¬ê² íê±°ë ë¶íìí ê²½ì ì¡°ê±´ì ì ë°í ì ììµëë¤. ë°ë¼ì awaitë ì¤ì§ íë¡ë¯¸ì¤ë¥¼ ê°ì¼ë¡ íì´ì¼ í ëìë§ ì¬ì©í´ì¼ í©ëë¤.
ë§ì´í¬ë¡íì¤í¬ë íë¡ë¯¸ì¤ê° í´ê²°ë ëë¿ë§ ìëë¼ ì¹ APIì ìí´ìë ë±ë¡ëë©°, 모ë ëì¼í ì°ì ììë¡ ì¤íë©ëë¤. ì´ë² ìì ìì queueMicrotask()를 ì¬ì©íë©° ê° await ííìì ë§ë¬ì ë ë§ì´í¬ë¡í
ì¤í¬ íê° ì´ë»ê² ì²ë¦¬ëëì§ ì¤ëª
í©ëë¤.
let i = 0;
queueMicrotask(function test() {
i++;
console.log("microtask", i);
if (i < 3) {
queueMicrotask(test);
}
});
(async () => {
console.log("async function start");
for (let i = 1; i < 3; i++) {
await null;
console.log("async function resume", i);
}
await null;
console.log("async function end");
})();
queueMicrotask(() => {
console.log("queueMicrotask() after calling async function");
});
console.log("script sync part end");
// Logs:
// async function start
// script sync part end
// microtask 1
// async function resume 1
// queueMicrotask() after calling async function
// microtask 2
// async function resume 2
// microtask 3
// async function end
ì´ë² ìì ìì, test() í¨ìë íì ë¹ë기 í¨ìê° ì¬ê°ë기 ì ì í¸ì¶ëë¯ë¡, ì´ë¤ì´ ê°ê° ë±ë¡íë ë§ì´í¬ë¡íì¤í¬ë ì½í ìë ë°©ìì¼ë¡ ì¤íë©ëë¤. íí¸, awaitì queueMicrotask()ë 모ë ë§ì´í¬ë¡íì¤í¬ì ë±ë¡ë기 ë문ì ì¤í ììë ë±ë¡ë ììì ë°ë¼ ê²°ì ë©ëë¤. ë¹ë기 í¨ìê° ì²ì ì¬ê°ë ì´íì "ë¹ë기 í¨ì를 í¸ì¶í ë¤ìì queueMicrotask()" ë¡ê·¸ê° ëìíë ì´ì ì
ëë¤.
ì¤í í¸ë ì´ì¤ í¥ììí¤ê¸°
ëëë¡, ë¹ë기 í¨ììì íë¡ë¯¸ì¤ê° ì§ì ë°íë ê²½ì° awaitë ìëµë기ë í©ëë¤.
async function noAwait() {
// ì¼ë¶ ëì ìí...
return /* await */ lastAsyncTask();
}
íì§ë§, lastAsyncTaskê° ë¹ë기ì ì¼ë¡ ì¤ë¥ë¥¼ ëì§ë ê²½ì°ë ê³ ë ¤í´ë³´ì¸ì.
async function lastAsyncTask() {
await null;
throw new Error("failed");
}
async function noAwait() {
return lastAsyncTask();
}
noAwait();
// Error: failed
// at lastAsyncTask
noAwaitìì íë¡ë¯¸ì¤ê° ì´ë¯¸ ë°íë ë¤ì ê±°ë¶ë기 ë문ì ì¤í í¸ë ì´ì¤ììë lastAsyncTaskë§ ëíë©ëë¤. ì´ë¤ ì미ììë, ì´ íë¡ë¯¸ì¤ê° noAwaitì ê´ë ¨ì´ ìë¤ê³ ë¶ ì ììµëë¤. ì¤í í¸ë ì´ì¤ë¥¼ ê°ì íë ¤ë©´, í´ë¹ íë¡ë¯¸ì¤ë¥¼ awaitë¡ ê°ì¸ ìì¸ê° íì¬ í¨ì ììì ë°ìíëë¡ ë§ë¤ ì ììµëë¤. ì´ë ê² íë©´ ìì¸ë ì¦ì ê±°ë¶ë ìë¡ì´ íë¡ë¯¸ì¤ë¡ ê°ì¸ì§ì§ë§, ì¤ë¥ê° ìì±ëë ìì ìì í¸ì¶ìê° ì¤í í¸ë ì´ì¤ì í¬í¨ë©ëë¤.
async function lastAsyncTask() {
await null;
throw new Error("failed");
}
async function withAwait() {
return await lastAsyncTask();
}
withAwait();
// Error: failed
// at lastAsyncTask
// at async withAwait
ì¼ë¶ ëì¤ì ì¸ ë¯¿ìê³¼ë ë¬ë¦¬, ì¤íê³¼ ìì§ì 기본ì ì¸ íë¡ë¯¸ì¤ì ì´íì ìµì ííë ë°©ì ëë¶ì return await promiseë ìµìí return promise ë§í¼ ë¹ ë¦
ëë¤. return promise를 ë ë¹ ë¥´ê² ë§ë¤ê¸°ë¥¼ ìí ì ìì´ ìì¼ë©°, V8ì ë¹ë기 í¨ì ìµì íì ëí´ìë íì¸í´ë³¼ ì ììµëë¤. ì¤íì¼ìì ì´ì 를 ì ì¸íë©´, ëë¶ë¶ì ê²½ì° return await를 ì¬ì©íë ê²ì´ ë°ëì§í©ëë¤.
ëª ì¸ì
| Specification |
|---|
| ECMAScript® 2027 Language Specification > # sec-async-function-definitions > |