diff --git a/README.md b/README.md index 2d813e3..a3c6fdc 100644 --- a/README.md +++ b/README.md @@ -41,4 +41,4 @@ https://ko.javascript.info/ | 5์ฃผ์ฐจ | [๐Ÿ”—](./daepan/5์ฃผ์ฐจ.md) | [๐Ÿ”—](./kimeodml/5์ฃผ์ฐจ.md) | | | 6์ฃผ์ฐจ | [๐Ÿ”—](./daepan/6์ฃผ์ฐจ.md) | [๐Ÿ”—](./kimeodml/6์ฃผ์ฐจ.md) | | | 7์ฃผ์ฐจ | [๐Ÿ”—](./daepan/7์ฃผ์ฐจ.md) | [๐Ÿ”—](./kimeodml/7์ฃผ์ฐจ.md) | | -| 8์ฃผ์ฐจ | [๐Ÿ”—](./daepan/8์ฃผ์ฐจ.md) | | | +| 8์ฃผ์ฐจ | [๐Ÿ”—](./daepan/8์ฃผ์ฐจ.md) | [๐Ÿ”—](./kimeodml/8์ฃผ์ฐจ.md) | | diff --git "a/kimeodml/8\354\243\274\354\260\250.md" "b/kimeodml/8\354\243\274\354\260\250.md" new file mode 100644 index 0000000..b89dff1 --- /dev/null +++ "b/kimeodml/8\354\243\274\354\260\250.md" @@ -0,0 +1,536 @@ +[1. ์ฝœ๋ฐฑ](#์ฝœ๋ฐฑ)
+[2. ํ”„๋ผ๋ฏธ์Šค](#ํ”„๋ผ๋ฏธ์Šค)
+[3. ํ”„๋ผ๋ฏธ์Šค ์ฒด์ด๋‹](#ํ”„๋ผ๋ฏธ์Šค-์ฒด์ด๋‹)
+[4. ํ”„๋ผ๋ฏธ์Šค์™€ ์—๋Ÿฌ ํ•ธ๋“ค๋ง](#ํ”„๋ผ๋ฏธ์Šค์™€-์—๋Ÿฌ-ํ•ธ๋“ค๋ง)
+[5. ํ”„๋ผ๋ฏธ์Šค API](#ํ”„๋ผ๋ฏธ์Šค-api)
+[6. ํ”„๋ผ๋ฏธ์Šคํ™”](#ํ”„๋ผ๋ฏธ์Šคํ™”)
+[7. ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ](#๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ)
+[8. async์™€ await](#async์™€-await)
+ +--- +### ์ฝœ๋ฐฑ +- *๋น„๋™๊ธฐ* ๋™์ž‘์„ ์Šค์ผ€์ค„๋ง ํ•  ์ˆ˜ ์žˆ์Œ > `์ฝœ๋ฐฑ` + ``` + function loadScript(src, callback) { + let script = document.createElement('script'); + script.src = src; + script.onload = () => callback(script); + document.head.append(script); + } + + loadScript('https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.2.0/lodash.js', script => { + alert(`${script.src}๊ฐ€ ๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.`); + alert( _ ); // ์Šคํฌ๋ฆฝํŠธ์— ์ •์˜๋œ ํ•จ์ˆ˜ + }); + ``` + - ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ํ•จ์ˆ˜(๋Œ€๊ฐœ ์ต๋ช… ํ•จ์ˆ˜)๋Š” ์›ํ•˜๋Š” ๋™์ž‘์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋จ + - '์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜' ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๋ฌด์–ธ๊ฐ€๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด ๋™์ž‘์ด ๋ชจ๋‘ ์ฒ˜๋ฆฌ๋œ ํ›„ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐˆ `์ฝœ๋ฐฑ`์„ ์ธ์ˆ˜๋กœ ๋ฐ˜๋“œ์‹œ ์ œ๊ณต + - `loadScript`์˜ ์ธ์ˆ˜๋กœ ์ฝœ๋ฐฑ์„ ์ œ๊ณต + +
+ +- ๋‘ ๊ฐœ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹ถ์„ ๋•Œ > ์ฝœ๋ฐฑ ์ค‘์ฒฉ + ``` + loadScript('/my/script.js', function(script) { + alert(`${script.src}์„ ๋กœ๋”ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์  , ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋”ฉํ•ฉ์‹œ๋‹ค.`); + + loadScript('/my/script2.js', function(script) { + alert(`๋‘ ๋ฒˆ์งธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋”ฉํ–ˆ์Šต๋‹ˆ๋‹ค.`); + }); + }); + ``` + +
+ +- ์ฝœ๋ฐฑ์—๋Ÿฌ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• + ``` + function loadScript(src, callback) { + let script = document.createElement('script'); + script.src = src; + + script.onload = () => callback(null, script); + // ์ง์ ‘ ์—๋Ÿฌ ๋˜์ง€๊ธฐ + script.onerror = () => callback(new Error(`${src}๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋„์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.`)); + + document.head.append(script); + } + + loadScript('/my/script.js', function(error, script) { + // ์˜ค๋ฅ˜ ์šฐ์„  ์ฝœ๋ฐฑ(error-first callback) + if (error) { + // ์—๋Ÿฌ ์ฒ˜๋ฆฌ + } else { + // ์Šคํฌ๋ฆฝํŠธ ๋กœ๋”ฉ์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚จ + } + }); + ``` + 1. `callback`์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์—๋Ÿฌ๋ฅผ ์œ„ํ•ด ๋‚จ๊ฒจ๋‘ . ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด ์ธ์ˆ˜๋ฅผ ์ด์šฉํ•ด `callback(err)`์ด ํ˜ธ์ถœ + 2. ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜(ํ•„์š”ํ•˜๋ฉด ์ธ์ˆ˜๋ฅผ ๋” ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ)๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋ฅผ ์œ„ํ•ด ๋‚จ๊ฒจ๋‘ . ์›ํ•˜๋Š” ๋™์ž‘์ด ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ์—” `callback(null, result1, result2...)`์ด ํ˜ธ์ถœ๋จ + +
+ +- `์ฝœ๋ฐฑ`์—์„œ ๋น„๋™๊ธฐ ๋™์ž‘์ด ๋งŽ์•„์งˆ ๊ฒฝ์šฐ > ์ฝœ๋ฐฑ ์ง€์˜ฅ / ๋ฉธ๋ง์˜ ํ”ผ๋ผ๋ฏธ๋“œ ๋ฐœ์ƒ + ``` + loadScript('1.js', function(error, script) { + + if (error) { + handleError(error); + } else { + // ... + loadScript('2.js', function(error, script) { + if (error) { + handleError(error); + } else { + // ... + loadScript('3.js', function(error, script) { + if (error) { + handleError(error); + } else { + // ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋กœ๋”ฉ๋œ ํ›„, ์‹คํ–‰ ํ๋ฆ„์ด ์ด์–ด์ง‘๋‹ˆ๋‹ค. (*) + } + }); + + } + }) + } + }); + ``` + - ๋…๋ฆฝ์ ์ธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์กด์žฌ > ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์ง€ ๋ชปํ•จ > 'ํ”„๋ผ๋ฏธ์Šค' ์‚ฌ์šฉ + +### ํ”„๋ผ๋ฏธ์Šค +- `promise` ์˜ ๋ฌธ๋ฒ• ๊ตฌ์กฐ + ``` + let promise = new Promise(function(resolve, reject) { + // executor (์ œ์ž‘ ์ฝ”๋“œ, '๊ฐ€์ˆ˜') + }); + ``` + - `new Promise`์— ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜๋Š” *executor(์‹คํ–‰์ž, ์‹คํ–‰ ํ•จ์ˆ˜)* ๋ผ๊ณ  ๋ถ€๋ฆ„ + - executor๋Š” `new Promise`๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š”๋ฐ, ๊ฒฐ๊ณผ๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ œ์ž‘ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•จ + - `resolve(value)` - ์ผ์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚œ ๊ฒฝ์šฐ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” `value`์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ + - `reject(error)` - ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์—๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” `error`์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ +- `new Promise` ์ƒ์„ฑ์ž๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” `promise` ๊ฐ์ฒด๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง + - `state` - ์ฒ˜์Œ์—” `'pending'`(๋ณด๋ฅ˜)์ด์—ˆ๋‹ค `resolve`๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด `'fulfilled'`, `reject`๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด `'rejected'`๋กœ ๋ณ€ํ•จ + - `result` - ์ฒ˜์Œ์—” `undefined`์ด์—ˆ๋‹ค `resolve(value)`๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด `value`๋กœ, `reject(error)`๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด `error`๋กœ ๋ณ€ํ•จ + ![[Pasted image 20240826172506.png|400]] + +
+ +- ํ”„๋ผ๋ฏธ์Šค ๊ฐ์ฒด๋Š” executor์™€ ๊ฒฐ๊ณผ๋‚˜ ์—๋Ÿฌ๋ฅผ ๋ฐ›์„ ์†Œ๋น„ ํ•จ์ˆ˜๋ฅผ ์ด์–ด์ฃผ๋Š” ์—ญํ•  + - ์†Œ๋น„ํ•จ์ˆ˜๋Š” `.then`, `.catch`, `.finally` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋“ฑ๋ก + +**then** +- `.then`์˜ ๋ฌธ๋ฒ• ๊ตฌ์กฐ + ``` + promise.then( + function(result) { /* ๊ฒฐ๊ณผ(result)๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค */ }, + function(error) { /* ์—๋Ÿฌ(error)๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค */ } + ); + ``` + - `.then`์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ดํ–‰๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ด๊ณ , ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฃธ + - ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ๊ฑฐ๋ถ€๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ด๊ณ , ์—๋Ÿฌ๋ฅผ ๋‹ค๋ฃธ + +
+ +- ์„ฑ๊ณต์ ์œผ๋กœ ์ดํ–‰๋œ ํ”„๋ผ๋ฏธ์Šค ์ฝ”๋“œ ์˜ˆ์‹œ + ``` + let promise = new Promise(function(resolve, reject) { + setTimeout(() => resolve("์™„๋ฃŒ!"), 1000); + }); + + // resolve ํ•จ์ˆ˜๋Š” .then์˜ ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜(์ธ์ˆ˜)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. + promise.then( + result => alert(result), // 1์ดˆ ํ›„ "์™„๋ฃŒ!"๋ฅผ ์ถœ๋ ฅ + error => alert(error) // ์‹คํ–‰๋˜์ง€ ์•Š์Œ + ); + + // ์„ฑ๊ณต์ ์ธ ๊ฒฐ๊ณผ๋ฌผ๋งŒ ๋‹ค๋ฃจ๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ + let promise = new Promise(resolve => { + setTimeout(() => resolve("์™„๋ฃŒ!"), 1000); + }); + + promise.then(alert); // 1์ดˆ ๋’ค "์™„๋ฃŒ!" ์ถœ๋ ฅ + ``` + +**catch** +- ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ๋งŒ ๋‹ค๋ฃจ๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ + - `.then(null, errorHandlingFunction)` + - `.catch(errorHandlingFunction)` + ``` + let promise = new Promise((resolve, reject) => { + setTimeout(() => reject(new Error("์—๋Ÿฌ ๋ฐœ์ƒ!")), 1000); + }); + + // .catch(f)๋Š” promise.then(null, f)๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค + promise.catch(alert); // 1์ดˆ ๋’ค "Error: ์—๋Ÿฌ ๋ฐœ์ƒ!" ์ถœ๋ ฅ + ``` + +**finally** +- ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๋“  ๋งˆ๋ฌด๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉด `finally`๋ฅผ ์‚ฌ์šฉ + - `finally(f)` + - `.then(f,f)` + ``` + new Promise((resolve, reject) => { + /* ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์–ด๋–ค ์ผ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ ํ›„ resolve, reject๋ฅผ ํ˜ธ์ถœํ•จ */ + }) + // ์„ฑ๊ณตยท์‹คํŒจ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด ์‹คํ–‰๋จ + .finally(() => ๋กœ๋”ฉ ์ธ๋””์ผ€์ดํ„ฐ ์ค‘์ง€) + .then(result => result์™€ err ๋ณด์—ฌ์คŒ => error ๋ณด์—ฌ์คŒ) + ``` + +
+ +- finally์™€ `.then(f,f)`์˜ ์ฐจ์ด์  + 1. `finally` ํ•ธ๋“ค๋Ÿฌ์—” ์ธ์ˆ˜๊ฐ€ ์—†์Œ. `finally`์—์„  ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ดํ–‰๋˜์—ˆ๋Š”์ง€, ๊ฑฐ๋ถ€๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Œ. `finally`์—์„  ์ ˆ์ฐจ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” '๋ณดํŽธ์ ' ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๊ณตโ€ข์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ๋ชฐ๋ผ๋„ ๋จ + 2. `finally` ํ•ธ๋“ค๋Ÿฌ๋Š” ์ž๋™์œผ๋กœ ๋‹ค์Œ ํ•ธ๋“ค๋Ÿฌ์— ๊ฒฐ๊ณผ์™€ ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌ + ``` + // ํ”„๋ผ๋ฏธ์Šค์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ด ์—๋Ÿฌ๊ฐ€ finally๋ฅผ ๊ฑฐ์ณ catch๊นŒ์ง€ ์ „๋‹ฌ๋จ + new Promise((resolve, reject) => { + setTimeout(() => resolve("๊ฒฐ๊ณผ"), 2000) + }) + .finally(() => alert("ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")) + .then(result => alert(result)); // <-- .then์—์„œ result๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ + ``` + - `finally`๋Š” ํ”„๋ผ๋ฏธ์Šค ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฒŒ ์•„๋‹˜. ํ”„๋ผ๋ฏธ์Šค ๊ฒฐ๊ณผ๋Š” `finally`๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋จ + 3. `.finally(f)`๋Š” ํ•จ์ˆ˜ `f`๋ฅผ ์ค‘๋ณตํ•ด์„œ ์“ธ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— `.then(f,f)`๋ณด๋‹ค ๋ฌธ๋ฒ• ์ธก๋ฉด์—์„œ ํŽธ๋ฆฌํ•จ + +
+ +- ํ”„๋ผ๋ฏธ์Šค๋ฅผ ํ™œ์šฉํ•œ `loadScript` ์ฝ”๋“œ + ``` + function loadScript(src) { + return new Promise(function(resolve, reject) { + let script = document.createElement('script'); + script.src = src; + + script.onload = () => resolve(script); + script.onerror = () => reject(new Error(`${src}๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋„์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ`)); + + document.head.append(script); + }); + } + + let promise = loadScript("https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"); + + promise.then( + script => alert(`${script.src}์„ ๋ถˆ๋Ÿฌ์™”์Šต๋‹ˆ๋‹ค!`), + error => alert(`Error: ${error.message}`) + ); + + promise.then(script => alert('๋˜๋‹ค๋ฅธ ํ•ธ๋“ค๋Ÿฌ...')); + + ``` + +### ํ”„๋ผ๋ฏธ์Šค ์ฒด์ด๋‹ +- ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๊ฒฝ์šฐ > ํ”„๋ผ๋ฏธ์Šค ์ฒด์ด๋‹ + ``` + new Promise(function(resolve, reject) { + setTimeout(() => resolve(1), 1000); // (*) + }).then(function(result) { // (**) + alert(result); // 1 + return result * 2; + }).then(function(result) { // (***) + alert(result); // 2 + return result * 2; + }).then(function(result) { + alert(result); // 4 + return result * 2; + }); + ``` + - `result`๊ฐ€ `.then` ํ•ธ๋“ค๋Ÿฌ์˜ ์ฒด์ธ(์‚ฌ์Šฌ)์„ ํ†ตํ•ด ์ „๋‹ฌ๋จ + 1. 1์ดˆ ํ›„ ์ตœ์ดˆ์˜ ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ดํ–‰๋จ - `(*)` + 2. ์ดํ›„ ์ฒซ๋ฒˆ์งธ `.then` ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ - `(**)` + 3. 2์—์„œ ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์Œ ๋‹ค์Œ `.then` ํ•ธ๋“ค๋Ÿฌ์— ์ „๋‹ฌ - `(***)` + 4. ์œ„์™€ ๊ฐ™์€ ๊ณผ์ • ๋ฐ˜๋ณต + +
+ +- **ํ”„๋ผ๋ฏธ์Šค ํ•˜๋‚˜์— `.then`์„ ์—ฌ๋Ÿฌ๊ฐœ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์€ ์ฒด์ด๋‹์ด ์•„๋‹˜** + ``` + let promise = new Promise(function(resolve, reject) { + setTimeout(() => resolve(1), 1000); + }); + + promise.then(function(result) { + alert(result); // 1 + return result * 2; + }); + + promise.then(function(result) { + alert(result); // 1 + return result * 2; + }); + + promise.then(function(result) { + alert(result); // 1 + return result * 2; + }); + ``` + - `result`๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ๊ฒƒ์ž„ + ![[Pasted image 20240827142426.png|400]] + - ๋™์ผํ•œ ํ”„๋ผ๋ฏธ์Šค์— ๋“ฑ๋ก๋œ `.then` ๋ชจ๋‘ ๋™์ผํ•œ ๊ฒฐ๊ณผ(`result`)๋ฅผ ๋ฐ›์Œ > ์ „๋ถ€ `1` ์ถœ๋ ฅ + - ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•œ ํ”„๋ผ๋ฏธ์Šค์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†์Œ > ์ฒด์ด๋‹์œผ๋กœ ์จ์•ผ ํ•จ + +
+ +- `.then(handler)`์— ์‚ฌ์šฉ๋œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ +- ํ•ธ๋“ค๋Ÿฌ๋Š” ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์Œ + ``` + new Promise(function(resolve, reject) { + setTimeout(() => resolve(1), 1000); + }).then(function(result) { + alert(result); // 1 + return new Promise((resolve, reject) => { // (*) + setTimeout(() => resolve(result * 2), 1000); + }); + }).then(function(result) { // (**) + alert(result); // 2 + return new Promise((resolve, reject) => { + setTimeout(() => resolve(result * 2), 1000); + }); + }).then(function(result) { + alert(result); // 4 + }); + ``` + - ์ฒซ ๋ฒˆ์งธ `.then`์€ `1`์„ ์ถœ๋ ฅํ•˜๊ณ  `new Promise(...)`๋ฅผ ๋ฐ˜ํ™˜ - `(*)` + - 1์ดˆ ํ›„ ์ด ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ดํ–‰๋˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋Š” ๋‘๋ฒˆ์งธ `.then`์œผ๋กœ ์ „๋‹ฌ. ๋‘ ๋ฒˆ์งธ ํ•ธ๋“ค๋Ÿฌ๋Š” `2`๋ฅผ ์ถœ๋ ฅ - `(**)` + - ๋™์ผํ•œ ๊ณผ์ • ๋ฐ˜๋ณต + => ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฌผ์ด ์ถœ๋ ฅ๋˜์ง€๋งŒ setTimeout์— ์˜ํ•ด 1์ดˆ์˜ ๋”œ๋ ˆ์ด๊ฐ€ ์ƒ๊น€ + +
+ +- `.then`์„ ์‚ฌ์šฉํ•ด `loadScript` ๊ฐœ์„  + ``` + loadScript("/article/promise-chaining/one.js") + .then(script => loadScript("/article/promise-chaining/two.js")) + .then(script => loadScript("/article/promise-chaining/three.js")) + .then(script => { + // ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์™”๊ธฐ ๋•Œ๋ฌธ์— ์Šคํฌ๋ฆฝํŠธ ๋‚ด์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + one(); + two(); + three(); + }); + ``` + +### ํ”„๋ผ๋ฏธ์Šค์™€ ์—๋Ÿฌ ํ•ธ๋“ค๋ง +- ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ๊ฑฐ๋ถ€๋˜๋ฉด ์ œ์–ด ํ๋ฅด๋ฏธ์ด ์ œ์ผ ๊ฐ€๊นŒ์šด rejection ํ•ธ๋“ค๋Ÿฌ๋กœ ๋„˜์–ด๊ฐ > `.catch`์—์„œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ + ``` + fetch('/article/promise-chaining/user.json') + .then(response => response.json()) + .then(user => fetch(`https://api.github.com/users/${user.name}`)) + .then(response => response.json()) + .then(githubUser => new Promise((resolve, reject) => { + let img = document.createElement('img'); + img.src = githubUser.avatar_url; + img.className = "promise-avatar-example"; + document.body.append(img); + + setTimeout(() => { + img.remove(); + resolve(githubUser); + }, 3000); + })) + .catch(error => alert(error.message)); + ``` + +
+ +- `throw` ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์—๋Ÿฌ๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ์Œ + ``` + new Promise((resolve, reject) => { + resolve("OK"); + }).then((result) => { + throw new Error("์—๋Ÿฌ ๋ฐœ์ƒ!"); // ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ๊ฑฐ๋ถ€๋จ + }).catch(alert); // Error: ์—๋Ÿฌ ๋ฐœ์ƒ! + ``` + +
+ +- ํ”„๋ผ๋ฏธ์Šค๋„ ์œ ์‚ฌํ•˜๊ฒŒ `try..catch` ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์—๋Ÿฌ๋ผ ํŒ๋‹จ๋˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋‹ค์‹œ ๋˜์งˆ ์ˆ˜ ์žˆ์Œ + ``` + // ์‹คํ–‰ ์ˆœ์„œ: catch -> catch + new Promise((resolve, reject) => { + throw new Error("์—๋Ÿฌ ๋ฐœ์ƒ!"); + }).catch(function(error) { // (*) + if (error instanceof URIError) { + // ์—๋Ÿฌ ์ฒ˜๋ฆฌ + } else { + alert("์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์—๋Ÿฌ"); + throw error; // ์—๋Ÿฌ ๋‹ค์‹œ ๋˜์ง€๊ธฐ + } + }).then(function() { + /* ์—ฌ๊ธฐ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. */ + }).catch(error => { // (**) + alert(`์•Œ ์ˆ˜ ์—†๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ: ${error}`); + // ๋ฐ˜ํ™˜๊ฐ’์ด ์—†์Œ => ์‹คํ–‰์ด ๊ณ„์†๋จ + }); + ``` + - `(*)`์—์„œ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชป ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๋ฅผ ๋‹ค์‹œ ๋˜์ง + +### ํ”„๋ผ๋ฏธ์Šค API +**Pormise.all** +- ๋ชจ๋“  ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ดํ–‰๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ทธ ๊ฒฐ๊ด๊ฐ’์„ ๋‹ด์„ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ +- **์ฃผ์–ด์ง„ ํ”„๋ผ๋ฏธ์Šค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด `Promise.all`์€ ๊ฑฐ๋ถ€๋˜๊ณ , ๋‚˜๋จธ์ง€ ํ”„๋ผ๋ฏธ์Šค์˜ ๊ฒฐ๊ณผ๋Š” ๋ฌด์‹œ๋จ** + ``` + Promise.all([ + new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1 + new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2 + new Promise(resolve => setTimeout(() => resolve(3), 1000)) // 3 + ]).then(alert); // ํ”„๋ผ๋ฏธ์Šค ์ „์ฒด๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด 1, 2, 3์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ฐ ํ”„๋ผ๋ฏธ์Šค๋Š” ๋ฐฐ์—ด์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. + ``` + +**Promise.allSettled** +- ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ + - ์‘๋‹ต ์„ฑ๊ณต - `{status:'fulfilled', value:result}` + - ์‘๋‹ต ์‹คํŒจ - `{status:'rejected', reason:error}` + ``` + let urls = [ + 'https://api.github.com/users/iliakan', + 'https://api.github.com/users/Violet-Bora-Lee', + 'https://no-such-url' + ]; + + Promise.allSettled(urls.map(url => fetch(url))) + .then(results => { // (*) + results.forEach((result, num) => { + if (result.status == "fulfilled") { + alert(`${urls[num]}: ${result.value.status}`); + } + if (result.status == "rejected") { + alert(`${urls[num]}: ${result.reason}`); + } + }); + }); + + // ์‘๋‹ต ๊ฒฐ๊ณผ (๊ฐ’ ๋˜๋Š” ์—๋Ÿฌ์˜ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ›์Œ) + [ + {status: 'fulfilled', value: ...์‘๋‹ต...}, + {status: 'fulfilled', value: ...์‘๋‹ต...}, + {status: 'rejected', reason: ...์—๋Ÿฌ ๊ฐ์ฒด...} + ] + ``` + +**Promise.race** +- ๊ฐ€์žฅ ๋จผ์ € ์ฒ˜๋ฆฌ๋œ ํ”„๋ผ๋ฏธ์Šค์˜ ๊ฒฐ๊ณผ ๋˜๋Š” ์—๋Ÿฌ๋ฅผ ๋‹ด์€ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ + ``` + Promise.race([ + new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)), + new Promise((resolve, reject) => setTimeout(() => reject(new Error("์—๋Ÿฌ ๋ฐœ์ƒ!")), 2000)), + new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000)) + ]).then(alert); // 1 + ``` + +**Promise.resolve** +- Promise.resolve - ์ฃผ์–ด์ง„ ๊ฐ’์„ ์‚ฌ์šฉํ•ด ์ดํ–‰ ์ƒํƒœ์˜ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋งŒ๋“ฆ +- Promise.reject - ์ฃผ์–ด์ง„ ์—๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฑฐ๋ถ€ ์ƒํƒœ์˜ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋งŒ๋“ฆ +- async/await์ด ๋Œ€์‹ ํ•˜๊ฒŒ ๋˜์—ˆ์Œ + +### ํ”„๋ผ๋ฏธ์Šคํ™” +- ์ฝœ๋ฐฑ์„ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ 'ํ”„๋ผ๋ฏธ์Šคํ™”'๋ผ๊ณ  ํ•จ +- ์ฝœ๋ฐฑ๋ณด๋‹ค ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ํŽธ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๋Š” ๊ฒŒ ์ข‹์€ ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Œ +- `loadScript(src, callback)`๋ฅผ ํ”„๋ผ๋ฏธ์Šคํ™”ํ•˜๊ธฐ + ``` + // Before + function loadScript(src, callback) { + let script = document.createElement('script'); + script.src = src; + + script.onload = () => callback(null, script); + script.onerror = () => callback(new Error(`${src}๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋„์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ`)); + + document.head.append(script); + } + + // ์‚ฌ์šฉ๋ฒ•: + // loadScript('path/script.js', (err, script) => {...}) + + // After + let loadScriptPromise = function(src) { + return new Promise((resolve, reject) => { + loadScript(src, (err, script) => { // callback์„ ์ œ์™ธํ•œ src ์ธ์ˆ˜๋งŒ ํ•„์š” + Promise๋ฅผ ๋ฐ˜ํ™˜ + if (err) reject(err) + else resolve(script); + }); + }) + } + + // ์‚ฌ์šฉ๋ฒ•: + // loadScriptPromise('path/script.js').then(...) + ``` + - `loadScriptPromsie`๋Š” ๊ธฐ์กด ํ•จ์ˆ˜ `loadScirpt`์— ๋ชจ๋“  ์ผ์„ ์œ„์ž„ํ•จ + - `loadScript`์˜ ์ฝœ๋ฐฑ์€ ์Šคํฌ๋ฆฝํŠธ ๋กœ๋”ฉ ์ƒํƒœ์— ๋”ฐ๋ผ `์ดํ–‰(fulfilled)` ํ˜น์€ `๊ฑฐ๋ถ€(rejected)` ์ƒํƒœ์˜ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ + +### ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ +- ํ”„๋ผ๋ฏธ์Šค ํ•ธ๋“ค๋Ÿฌ `.then/catch/finally`๋Š” ํ•ญ์ƒ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ +- ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ฆ‰์‹œ ์ดํ–‰๋˜๋”๋ผ๋„ `.then/catch/finally` *์•„๋ž˜*์— ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์ด ํ•ธ๋“ค๋Ÿฌ๋“ค์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ์‹คํ–‰๋จ + ``` + // '์ฝ”๋“œ ์ข…๋ฃŒ!' -> 'ํ”„๋ผ๋ฏธ์Šค ์„ฑ๊ณต!' + let promise = Promise.resolve(); + + promise.then(() => alert("ํ”„๋ผ๋ฏธ์Šค ์„ฑ๊ณต!")); + alert("์ฝ”๋“œ ์ข…๋ฃŒ"); // ์–ผ๋Ÿฟ ์ฐฝ์ด ๊ฐ€์žฅ ๋จผ์ € ๋œน๋‹ˆ๋‹ค. + ``` + +- ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์ ์ ˆํ•œ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” > '๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ'์—์„œ ๊ด€๋ฆฌ + - ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ๋Š” ๋จผ์ € ๋“ค์–ด์˜จ ์ž‘์—…์„ ๋จผ์ € ์‹คํ–‰ํ•จ(FIFO) + - ์‹คํ–‰ํ•  ๊ฒƒ์ด ์•„๋ฌด๊ฒƒ๋„ ๋‚จ์ง€ ์•Š์„ ๋•Œ๋งŒ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์— ์žˆ๋Š” ์ž‘์—…์ด ์‹คํ–‰๋จ +- ์–ด๋–ค ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ค€๋น„๋˜์—ˆ์„ ๋•Œ ์ด ํ”„๋ผ๋ฏธ์Šค์˜ `.then/catch/finally` ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ์— ๋“ค์–ด๊ฐ„๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋จ. ์ด๋•Œ ํ•ธ๋“ค๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ ์‹คํ–‰๋˜์ง€ ์•Š์Œ. ํ˜„์žฌ ์ฝ”๋“œ์—์„œ ์ž์œ ๋กœ์šด ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ์—์„ธ์–ดใ…‘ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ์—์„œ ์ž‘์—…์„ ๊บผ๋‚ด ์‹คํ–‰ํ•จ < '์ฝ”๋“œ ์ข…๋กœ'๊ฐ€ ๋จผ์ € ์ถœ๋ ฅ๋˜๋Š” ์ด์œ  + ![[Pasted image 20240829131519.png|400]] + +
+ +- ํ”„๋ผ๋ฏธ์Šค ํ•ธ๋“ค๋Ÿฌ๋Š” ํ•ญ์ƒ ๋‚ด๋ถ€ ํ๋ฅผ ํ†ต๊ณผํ•จ +- ์—ฌ๋Ÿฌ ๊ฐœ์˜ `.then/catch/finally`๋ฅผ ์‚ฌ์šฉํ•ด ๋งŒ๋“  ์ฒด์ธ์˜ ๊ฒฝ์šฐ, ๊ฐ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋จ. ํ์— ๋“ค์–ด๊ฐ„ ํ•ธ๋“ค๋Ÿฌ ๊ฐ๊ฐ์€ ํ˜„์žฌ ์ฝ”๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๊ณ , ํ์— ์ ์ œ๋œ ์ด์ „ ํ•ธ๋“ค๋Ÿฌ์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋จ +- **'ํ”„๋ผ๋ฏธ์Šค ์„ฑ๊ณต!'์„ ๋จผ์ €, '์ฝ”๋“œ ์ข…๋ฃŒ'๋ฅผ ๋‚˜์ค‘์— ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜?'** > `.then`์„ ์‚ฌ์šฉํ•ด ํ์— ๋„ฃ๊ธฐ + ``` + Promise.resolve() + .then(() => alert("ํ”„๋ผ๋ฏธ์Šค ์„ฑ๊ณต!")) + .then(() => alert("์ฝ”๋“œ ์ข…๋ฃŒ")); + ``` + +### async์™€ await +- function ์•ž์— `async`๋ฅผ ๋ถ™์ด๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ +- `await`์€ ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ +- [ํ”„๋ผ๋ฏธ์Šค ์ฒด์ด๋‹](https://ko.javascript.info/promise-chaining)ย ์ฑ•ํ„ฐ์˜ย `showAvatar()`ย ์˜ˆ์‹œ๋ฅผย `async/await`๋กœ ์ž‘์„ฑ + 1. `.then` ํ˜ธ์ถœ์„ `await`์œผ๋กœ ๋ณ€๊ฒฝ + 2. function ์•ž์— `async`๋ฅผ ๋ถ™์—ฌ `await`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ + ``` + async function showAvatar() { + // JSON ์ฝ๊ธฐ + let response = await fetch('/article/promise-chaining/user.json'); + let user = await response.json(); + + // github ์‚ฌ์šฉ์ž ์ •๋ณด ์ฝ๊ธฐ + let githubResponse = await fetch(`https://api.github.com/users/${user.name}`); + let githubUser = await githubResponse.json(); + + // ์•„๋ฐ”ํƒ€ ๋ณด์—ฌ์ฃผ๊ธฐ + let img = document.createElement('img'); + img.src = githubUser.avatar_url; + img.className = "promise-avatar-example"; + document.body.append(img); + + // 3์ดˆ ๋Œ€๊ธฐ + await new Promise((resolve, reject) => setTimeout(resolve, 3000)); + img.remove(); + return githubUser; + } + + showAvatar(); + ``` + +
+ +- `try..catch`๋ฅผ ์‚ฌ์šฉํ•ด ์—๋Ÿฌ ํ•ธ๋“ค๋ง + ``` + async function f() { + try { + let response = await fetch('http://์œ ํšจํ•˜์ง€-์•Š์€-์ฃผ์†Œ'); + let user = await response.json(); + } catch(err) { + // fetch์™€ response.json์—์„œ ๋ฐœํ–‰ํ•œ ์—๋Ÿฌ ๋ชจ๋‘๋ฅผ ์—ฌ๊ธฐ์„œ ์žก์Šต๋‹ˆ๋‹ค. + alert(err); // TypeError: failed to fetch + } + } + + f(); + ``` \ No newline at end of file