๋ฌธ์ ๋ชฉ๋ก์ผ๋ก ๋์๊ฐ๊ธฐ
๐ก์ง์์๋ต์ https://github.com/pul8219/TIL
Issues
ํญ์ ์๋ง์ step ์ด์์์ ๋จ๊ฒจ์ฃผ์ธ์. โก๏ธ Issueํญ์ผ๋ก ์ด๋
- ์์ฑ์: Wol-dan (@pul8219)
- ์คํฐ๋ ์ฃผ์ : FrontEnd ๋ฉด์ ์คํฐ๋ https://gitlab.com/siots-study/topics/-/wikis/home
- ๊ณต๋ถ ๋ฒ์: Asyncronous์ ๋น๋๊ธฐ ํจ์, Exception Handling ์์ธ ์ฒ๋ฆฌ
- ๊ธฐํ: 9/5(ํ ) ~ 9/8(ํ)
- ํ๋กํ ํ์
- ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์๊ฐ ํธ์ถ ์คํ์ ๋์ ๋ฐฉ๋ฒ
- Promise ์ธ ๋ ๋ค์ํ ์๋ฌ ์ฒ๋ฆฌ ์์ https://gitlab.com/siots-study/topics/-/wikis/exception-handling
- ์๋ฌ๊ฐ์ฒด.constructor ๊ฐ์ฒด .constructor .prototype ๋ฑ ...
Javascript๋ ์ฝ๋ ์คํ ์ค์ ์๊ธฐ์น ๋ชปํ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋, ์ด๋ก๋ถํฐ ์ฝ๋์ ์คํ ํ๋ฆ์ ๋ณต๊ตฌํ ์ ์๋ ์์ธ ์ฒ๋ฆฌ(Exception Handling) ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด์๋ค.
(์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ ์ฒด ์ฝ๋๋ฅผ ์ค๋จ์ํค๋ ๊ฒ์ด ์๋๋ผ ํน์ ์ฝ๋๋ถํฐ ๋ค์ ์คํ๋๋๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒ! )
ํ๋ก ํธ์๋ ๋ฉด์ ์คํฐ๋, ์์ธ ์ฒ๋ฆฌ
JavaScript๋ก ๋ง๋๋ ์ธ์, ์์ธ ์ฒ๋ฆฌ
์ด ๋ฌธ์๋ ์ ๋ ๋ฌธ์ ๋ด์ฉ ์ ๋ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ดํดํ๋ฉด์ ๊ฑฐ์ ๊ฐ๊ฒ ์์ฑํ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ผ๋ก ๊ด๋ จ ๋ด์ฉ ํ์ตํด ๋์ ์ธ์ด๋ก ๋ฌธ์ ์์ ํ์!
try-catch-finally
๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์๋ฌ๊ฐ ๋๋๋ผ๋ ์ฝ๋์ ์คํ์ ์ง์ํ ์ ์๋ค.
-
try
๋ธ๋ก ๋ด๋ถ์ ์ฝ๋๋ฅผ ์คํํ๋ค๊ฐ -
์๋ฌ๊ฐ ๋ฐ์ํ๋ ์๊ฐ ์์ง ์คํ๋์ง ์์ ๋๋จธ์ง ์ฝ๋๋ค์ ๋ฌด์๋ ์ฑ
catch
๋ธ๋ก์ผ๋ก ์คํ ํ๋ฆ์ด ๋์ด๊ฐ๋ค.
catch
๋ try
๋ธ๋ก์์ ๋ฐ์ํ ์๋ฌ์ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
finally
๋ธ๋ก ๋ด์ ์ฝ๋๋ try
๋ธ๋ก ์์์์ ์๋ฌ ๋ฐ์ ์ฌ๋ถ์ ๊ด๊ณ ์์ด ๋ฌด์กฐ๊ฑด ์คํ๋๋ค. try
๋ธ๋ก ๋ด์์ return
, break
, continue
๋ฑ์ผ๋ก ์ฝ๋์ ์คํ ํ๋ฆ์ด ์ด๋๋ ๋๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
for (let i of [1, 2, 3]) {
try {
if (i === 3) {
break;
}
} finally {
console.log(`ํ์ฌ i์ ๊ฐ: ${i}`);
}
}
// ์คํ ๊ฒฐ๊ณผ
// 'ํ์ฌ i์ ๊ฐ: 1'
// 'ํ์ฌ i์ ๊ฐ: 2'
// 'ํ์ฌ i์ ๊ฐ: 3'
- ์คํ๊ฒฐ๊ณผ
// try-catch-finally
try {
console.log('์ ์คํ๋๋ ์ค');
new Array(-1); // ๐
console.log('์๋ฌ ๋ฐ์ ํ ์ฝ๋๋ ์คํ๋์ง ์์');
} catch (e) {
console.log('์๋ฌ๊ฐ ๋ฐ์ํด ์ฝ๋์ ์คํ ํ๋ฆ์ด catch ๋ธ๋ก์ผ๋ก ์ฎ๊ฒจ์์');
console.log(`์๋ฌ๋ช
: ${e.name} ๋ด์ฉ: ${e.message}`);
} finally {
console.log('finally');
}
// ์คํ ๊ฒฐ๊ณผ
// '์ ์คํ๋๋ ์ค'
// '์๋ฌ๊ฐ ๋ฐ์ํด ์ฝ๋์ ์คํ ํ๋ฆ์ด catch ๋ธ๋ก์ผ๋ก ์ฎ๊ฒจ์์'
// '์๋ฌ๋ช
: RangeError ๋ด์ฉ: Invalid array length'
// 'finally'
- ๐ ๋ผ์ธ์์ ์๋ฌ๊ฐ ๋ฌ์ ๋ ์คํ๊ฒฐ๊ณผ
์ฆ, try-catch-finally
๊ตฌ๋ฌธ์์ ์ฝ๋์ ์คํ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
-
์๋ฌ๊ฐ ๋์ง ์์์ ๋:
try
-finally
-
์๋ฌ๊ฐ ๋ฌ์ ๋:
try
- ์๋ฌ ๋ฐ์ -catch
-finally
@eyabc ๋ ๋ฌธ์ ์ฐธ๊ณ ํ์ฌ ์ถ๊ฐ
- ์์์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ถ์ง ์์ ๋
- ์์ํ ํ๋ก์ธ์ค๊ฐ ๋ง๋ฌด๋ฆฌ ๋์๋์ง ํ์คํ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ
function func() {
// ๋ฌด์ธ๊ฐ๋ฅผ ์ธก์ ํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ๋๋งบ์์ด ์์ด์ผ ํ๋ ํ๋ก์ธ์ค
try {
// ...
} finally {
// ์คํฌ๋ฆฝํธ๊ฐ ์ฃฝ๋๋ผ๋ ์๋ฃ๋จ
}
}
- try ์์์ ๋ฐ์ํ ์๋ฌ๋ ์ธ๋ถ์์ catch ํด์ฃผ์ด์ผ ํ๋ค.
- finally ๋ ์คํํ๋ฆ์ด ํจ์๋ฅผ ๋ ๋๊ธฐ ์ ์ ์คํ๋๋ค.
Error ์์ฑ์์ throw
์ฐ์ฐ์๋ฅผ ์ด์ฉํด ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์๋ฌ๋ฅผ ๋ฐ์์ํค ์๋ ์๋ค.
const even = parseInt(prompt('์ง์๋ฅผ ์
๋ ฅํ์ธ์'));
if (even % 2 !== 0) {
throw new Error('์ง์๊ฐ ์๋๋๋ค.');
}
- ์คํ ๊ฒฐ๊ณผ
throw new Error('์ง์๊ฐ ์๋๋๋ค.');
์ ์ฝ๋์์ Error ์์ฑ์๋ฅผ ์ด์ฉํ์ฌ ์ธ์๋ก ์ํ๋ ์๋ฌ๋ฉ์์ง ๋ด์ฉ์ ๋ฃ์ด์ฃผ์๋ค. ์ด๋ ๊ฒ ๋๋ฉด ํด๋น ์๋ฌ ๋ฉ์์ง๋ฅผ ์์ฑ์ผ๋ก ๊ฐ์ง ์๋ฌ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ๊ทธ ์ฆ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
Error ๋ง๊ณ ๋ SyntaxError, ReferenceError ๋ฑ์ ๋ค๋ฅธ ์ฌ๋ฌ ์๋ฌ ํ์ ์ด ์๋ค.
๋จ ์ธํฐ๋ท ์ต์คํ๋ก๋ฌ๋ Error() ์์ฑ์์ ๋ํด์๋ง ์ปค์คํ ์๋ฌ ๋ฉ์์ง๋ฅผ ํ์ํ๋ค๊ณ ํ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ปค์คํ ํ ๊ฒฝ์ฐ์ Error()๋ง ์ฐ๋ ๊ฒ์ ๊ถ์ฅ
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์๋ฌ ๊ฐ์ฒด๋ Error ๊ฐ์ฒด๋ฅผ ์์๋ฐ๋๋ค. ์ปค์คํ ์๋ฌ๋ฅผ ์์ฑํ ๋๋ Error ๊ฐ์ฒด๋ฅผ ์์๋ฐ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
์ด๋ ๊ฒ ์๋ฌ ๋ฉ์์ง๋ง ์ปค์คํ ํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ
๋ค์๊ณผ ๊ฐ์ด ์ปค์คํ ์๋ฌ๋ฅผ ์์ฑํ์ฌ ์๋ฌ์ ์ข ๋ฅ๋ฅผ ๊ตฌ๋ถํ๊ฑฐ๋ ์๋ฌ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค.
์ปค์คํ ์๋ฌ๋ฅผ ์ฐ๋ฉด ์ด๋์ ์ด๋ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์ ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊น ์ ์ฉ์ดํ๋ค.
class MyError extends Error {
constructor(value, message, ...params) {
super(...params);
this.value = value;
this.message = message;
this.name = 'MyError';
}
}
try {
const even = parseInt(prompt('์ง์๋ฅผ ์
๋ ฅํ์ธ์'));
if (even % 2 !== 0) {
throw new MyError(even, '์ง์๊ฐ ์๋๋๋ค.');
}
} catch (e) {
if (e instanceof MyError) {
console.log(e.value); // ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์ ์๊ฐ ์ ์ฅ๋ ๋ณ์ even์ ๊ฐ
console.log(e.message); // ์ธ์๋ก ๋๊ฒจ์ค ๋ฉ์์ง '์ง์๊ฐ ์๋๋๋ค.'
console.log(e.name); // ์ง์ ํ ์๋ฌ ์ด๋ฆ 'MyError'
}
}
@eyabc ๋ ๊ธ ์ฐธ๊ณ ํ์ฌ ์ถ๊ฐ
- name
- ์๋ฌ ์ด๋ฆ
- 'ReferenceError' : ์ ์๋์ง ์์ ๋ณ์ ๋๋ฌธ์ ๋ฐ์ํ ์๋ฌ
- message
- ์๋ฌ ์์ธ ๋ด์ฉ์ ๋ด๊ณ ์๋ ๋ฌธ์ ๋ฉ์ธ์ง
- stack
- ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋นํ์ค ํ๋กํผํฐ
- ํ์ฌ ํธ์ถ ์คํ, ์๋ฌ๋ฅผ ์ ๋ฐํ ์ค์ฒฉ ํธ์ถ๋ค์ ์์ ์ ๋ณด๋ฅผ ๊ฐ์ง ๋ฌธ์์ด
- ๋๋ฒ๊น ๋ชฉ์
๋น๋๊ธฐ์์ผ๋ก ์๋ํ๋ ์ฝ๋ฐฑ ๋ด๋ถ์์ ๋ฐ์ํ ์๋ฌ๋, ์ฝ๋ฐฑ ๋ฐ๊นฅ์ ์๋ try
๋ธ๋ก์ผ๋ก๋ ์ก์๋ผ ์ ์๋ค.
try {
setTimeout(() => {
throw new Error('์๋ฌ!');
});
} catch (e) {
console.error(e);
}
์ ์์ ์์ try ๋ธ๋ก์ ์๋ฌ๋ฅผ ์ก์๋ด์ง ๋ชปํ๊ณ ์๋ฌ ๊ฐ์ฒด๋ ์ถ๋ ฅ๋์ง ์๋๋ค.
TODO ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์๊ฐ ํธ์ถ ์คํ์ ๋์ ๋ฐฉ๋ฒ
JavaScript ์์ง์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์๊ฐ ํธ์ถ ์คํ์ ๋๊ฐ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ์ด ๊ณผ์ ์ค์ try ๋ธ๋ก์ ๋ง๋์ผ ์ฝ๋์ ์คํ ํ๋ฆ์ ์์๋ณต๊ตฌ์ํฌ ์ ์์ต๋๋ค. ์ ์์ ์์ setTimeout์ ๋๊ฒจ์ง ์ฝ๋ฐฑ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด, ํธ์ถ ์คํ์ ๋ฐ๋ผ ์ฌ๋ผ๊ฐ๋ try ๋ธ๋ก์ ๋ง๋๋ ๊ฒ์ด ์๋๋ฏ๋ก, ์ฝ๋์ ์คํ ํ๋ฆ์ด catch ๋ธ๋ก์ผ๋ก ์ฎ๊ฒจ์ง์ง ์๋ ๊ฒ์ ๋๋ค.
์ ์์ ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ณ ์ณ try
๋ธ๋ก์ด ๋น๋๊ธฐ ์ฝ๋ฐฑ ๋ด๋ถ์ ์์นํ๋๋ก ํด์ผ ํ๋ค.
setTimeout(() => {
try {
throw new Error('์๋ฌ!');
} catch (e) {
console.error(e);
}
});
TODO Promise ์ธ ๋ ๋ค์ํ ์๋ฌ ์ฒ๋ฆฌ ์์ https://gitlab.com/siots-study/topics/-/wikis/exception-handling
Promise ๊ฐ์ฒด์ ์ธ ๊ฐ์ง ์ํ
-
pending - Promise ๊ฐ์ฒด์ ๊ฒฐ๊ณผ๊ฐ์ด ์ฑ์์ง์ง ์์ ์ํ
-
fulfilled - Promise ๊ฐ์ฒด์ ๊ฒฐ๊ณผ๊ฐ์ด ์ฑ์์ง ์ํ
-
rejected - Promise ๊ฐ์ฒด์ ๊ฒฐ๊ณผ๊ฐ์ ์ฑ์ฐ๋ ค๊ณ ์๋ํ๋ค๊ฐ ์๋ฌ๊ฐ ๋ ์ํ
Promise ๊ฐ์ฒด๊ฐ rejected ์ํ๊ฐ ๋๋ฉด, ์ด Promise์ ๋ํด์๋ then ๋ฉ์๋์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋๊ฒจ์ค ์ฝ๋ฐฑ์ด ์คํ๋์ง ์๊ณ , ๋ ๋ฒ์งธ ์ธ์๋ก ๋๊ฒจ์ค ์ฝ๋ฐฑ์ด ๋์ ์คํ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ฝ๋ฐฑ์๋ ์๋ฌ ๊ฐ์ฒด๊ฐ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ฃผ์ด์ง๋ค.
const p = new Promise((resolve) => {
const even = parseInt(prompt('์ง์๋ฅผ ์
๋ ฅํ์ธ์'));
if (even % 2 !== 0) {
throw new Error('์ง์๊ฐ ์๋๋๋ค.');
} else {
resolve(even);
}
});
p.then(
(even) => {
return '์ง์์
๋๋ค.';
},
(e) => {
// ์๋ฌ์ ์คํ๋๋ ์ฝ๋ฐฑ(๋ ๋ฒ์งธ ์ธ์๋ก ๋๊ฒจ์ค ์ฝ๋ฐฑ)
return e.message;
}
).then(alert);
catch
๋ฉ์๋๋ฅผ ์ด์ฉํด ์๋ฌ ์ฒ๋ฆฌ ์ฝ๋ฐฑ์ ์ง์ ํ ์๋ ์๋ค.
p.then((even) => {
return '์ง์์
๋๋ค.';
})
.catch((e) => {
return e.message;
})
.then(alert);
then
๋ฉ์๋์ ์ฐ์ ์์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด, try-catch ๊ตฌ๋ฌธ๊ณผ ์ ์ฌํ๊ฒ ์ฒ์ ๋ง๋๋ ์๋ฌ ์ฒ๋ฆฌ ์ฝ๋ฐฑ์ผ๋ก ์ฝ๋์ ์คํ ํ๋ฆ์ด ๊ฑด๋๋ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๊ฒ ๋๋ค.
Promise.resolve()
.then(() => {
throw new Error('catch ๋ฉ์๋๋ฅผ ํตํด ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.');
})
.then(() => {
console.log('์ด ์ฝ๋๋ ์คํ๋์ง ์์ต๋๋ค.');
})
.catch((e) => {
return e.message; // ์ฌ๊ธฐ์ ์๋ฌ ์ฒ๋ฆฌ
})
.then(console.log);
ํน์
Promise.resolve()
.then(() => {
throw new Error('catch ๋ฉ์๋๋ฅผ ํตํด ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.');
})
.then(
() => {
console.log('์ด ์ฝ๋๋ ์คํ๋์ง ์์ต๋๋ค.');
},
(e) => {
return '์ด์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค'; // ์๋ฌ ์ฒ๋ฆฌ
}
)
.catch((e) => {
return e.message; // ์์์ ์๋ฌ์ฒ๋ฆฌ ํ์ผ๋ ์ด ๋ฉ์๋๋ ์คํ ์๋จ
})
.then(console.log);
์์๋ณธ Promise์ ์์ธ์ฒ๋ฆฌ ๋ฐฉ์์ ๋๊ธฐ์ ์์ธ ์ฒ๋ฆฌ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ ์ฝ๋ฐฑ์ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ ๊ฒฝํฅ์ด ์๋ค.
๋น๋๊ธฐ ํจ์ ๋ด๋ถ์์๋ rejected ์ํ์ Promise ๊ฐ์ฒด๋ฅผ ๋๊ธฐ์ ์์ธ ์ฒ๋ฆฌ ๋ฐฉ์๊ณผ ๋์ผํ๊ฒ try-catch-finally
๊ตฌ๋ฌธ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
async function func() {
try {
const res = await fetch('https://nonexistent-domain.nowhere');
} catch (e) {
console.log(e.message);
}
}
func(); // ์คํ ๊ฒฐ๊ณผ: Failed to fetch
๋จ, Promise ๊ฐ์ฒด์ ๋ํด await
ํ์ง ์๋ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ์ก์ ์ ์๋ค.
async function func() {
try {
fetch('https://nonexistent-domain.nowhere');
} catch (e) {
console.log(e.message);
}
}
func(); // ์คํ ๊ฒฐ๊ณผ: ์๋ฌด๊ฒ๋ ์ถ๋ ฅ๋์ง ์์
์ ์์ ์์ ์๋ฌ๋ฅผ ์ก์ ์ ์๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
-
then ๋ฉ์๋์ ๋ ๋ฒ์งธ ์ธ์ ์ด์ฉ
-
catch ๋ฉ์๋ ์ด์ฉ
// ์ ์์ ๋ฅผ ํด๊ฒฐํ์ฌ ์๋ฌ๋ฅผ ์ก๋ ์ฝ๋
// then ๋ฉ์๋์ ๋ ๋ฒ์งธ ์ธ์ ํน์ catch ๋ฉ์๋๋ก ํด๊ฒฐ
async function func() {
fetch('https://nonexistent-domain.nowhere').catch((e) =>
console.log(e.message)
);
}
func(); // ์คํ ๊ฒฐ๊ณผ: Failed to fetch
- @khw970421 ๋ ๋ด์ฉ ์ถ๊ฐ
try {
console.log('์ ์คํ๋ฉ๋๋ค.');
console.log(v);
console.log('๋ฒ๋ ค์ง');
} catch (e) {
switch (e.constructor) {
case SyntaxError:
console.log('์์คํ');
break;
case ReferenceError:
console.log(e.constructor);
console.log('์คํ');
break;
}
}
์ด๋ e.name์ด ์๋ e.constructor๋ฅผ ์จ์ผํ๋ ์ด์ ๋ e.name์ String์ด๊ณ e.constructor๋ ์ ํํ๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ ReferenceError์ ๊ฐ์ ํ์ ์ด๊ธฐ๋๋ฌธ
try {
console.log('์ ์คํ๋ฉ๋๋ค.');
console.log(v);
console.log('๋ฒ๋ ค์ง');
} catch (e) {
console.log(e.name === ReferenceError); //false
console.log(e.constructor === ReferenceError); //true
console.log(typeof e.constructor); //function
console.log(typeof ReferenceError); //function
console.log(toString.call(e.constructor)); //[object Function]
console.log(toString.call(ReferenceError)); //[object Function]
}
ํ๋ก ํธ์๋ ๋ฉด์ ์คํฐ๋, ์์ธ ์ฒ๋ฆฌ
JavaScript๋ก ๋ง๋๋ ์ธ์, ์์ธ ์ฒ๋ฆฌ
ํ์๋ค ๊ฒฐ๊ณผ๋ฌผ ๋ฐ ์ง์์๋ต&์ฝ๋๋ฆฌ๋ทฐ
[์ง๋ฌธ]
//(3) async ์ฌ์ฉ ๐
// async๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ํจ์ ์์ ์ฝ๋ ๋ธ๋ญ๋ค์ด ์๋์ผ๋ก Promise๋ก ๋ฐ๋
async function fetchUser() {
// do network request in 10 secs...
// ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ฐ์์ค๋๋ฐ 10์ด๊ฐ ๊ฑธ๋ฆฌ๋ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์
return 'yurim';
}
์์ ์ฝ๋ ๋ธ๋ญ๋ค์ด ์๋์ผ๋ก Promise๋ก ๋ฐ๋ ์ ๋ํด์ ์ฝ๋๋ธ๋ก์ด ์ด๋ป๊ฒ Promise ๋ก ๋ฐ๋๋์ง์ ๋ํ ์ค๋ช ์ ๋ง๋ถ์ฌ์ฃผ๋ฉด ์ข์๊ฒ๊ฐ์์
์ผ๋จ์, ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ฐํ๊ฐ์ ํญ์ Promise ๊ฐ์ฒด๋ค ๋ผ๋ ๋ง์ด ๋ ๋ช ํํ์ง ์์๊น์?
function ์ด Promise ๊ฐ ์๋ ๊ฐ์ ๋ฐํํด๋, ์ดํ ์ํ์ Promise ๋ก ๊ฐ์ธ ๋ฐํํ๋ค.
async function func1() {
return 1;
}
/*
func1()
Promise {
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: 1
}
*/
Promise ์ ๋ช ์์ ๋ฐํ
๋น๋๊ธฐ ํจ์ ๋ด์์ return ํ ๊ฐ์ด, Promise ๊ฐ์ฒด์ [[PromiseResult]] ๊ฐ
async function func2() {
return Promise.resolve(2);
}
/*
func2()
Promise {
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: 2
}
*/
async function func4() {
return Promise.reject(2);
}
/*
func4()
Promise {
[[PromiseState]]: "rejected"
[[PromiseResult]]: 2
}
*/
๋น๋๊ธฐ ํจ์์์ return ์ ํด์ฃผ์ง ์์์ ๋,
async function func3() {}
/*
func3()
Promise {
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: undefined
}
*/
๋น๋๊ธฐ ํจ์์ ๋ฐํ๊ฐ์ ๋ํด์ ์ ๊ฒฝ์ ์จ๋ณด์ง ์์๋๋ฐ, ์ ๋ฆผ๋ ๊ธ ์ฝ๊ณ ์ ๋ฆฌํ๋ฉด์ ๋ค์ํ๋ฒ ๊ณต๋ถํ๊ฒ ๋์ด์!
๋นต๊ณผ ์ปคํผ๋ฅผ ๋ฐํํ๋ ๋น๋๊ธฐ ํจ์์ ์์ ๊ฐ ์ธ์๊น์ด์!
async function getBread() {
await delay(1000); // 1์ด๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ
return '๐ฅ'; //๋ฅผ ๋ฆฌํดํ๋ Promise๊ฐ ๋ง๋ค์ด์ง
}
async function getCoffee() {
await delay(1000); // 1์ด๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ
return 'โ๏ธ'; //๋ฅผ ๋ฆฌํดํ๋ Promise๊ฐ ๋ง๋ค์ด์ง
}
// 1) Promise.all
// Promise ๋ฐฐ์ด์ ์ ๋ฌํ๋ฉด, ๋ชจ๋ Promise๋ค์ด ๋ณ๋ ฌ์ ์ผ๋ก ๋ค ๋ด๊ธธ๋๊น์ง ๋ชจ์์ฃผ๋ ์น๊ตฌ. ๋ด๊ธธ๋๋ ๋ฐฐ์ด๋ก ๋ด๊น
์ ์ค๋ช ์์ ์ถ๊ฐ์ ์ผ๋ก iterable ์์ reject ๊ฐ ๋ฐ์ํด๋ ์ทจ์๋์ง ์๊ณ , ๋๋จธ์ง Promise ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ถํ์ง๋ง ๋ฌด์๋ฉ๋๋ค
const mixedPromisesArray = [Promise.resolve(33), Promise.reject(44)];
const p = Promise.all(mixedPromisesArray); // (1) Promise { <state>: "pending" }
console.log(p); // (3) Promise { <state>: "rejected", <reason>: 44 }
setTimeout(function () {
console.log('the stack is now empty'); // (2) the stack is now empty
console.log(p);
});
[๋ต๋ณ]
@eyabc
๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ฐํ๊ฐ์ ํญ์ Promise ๊ฐ์ฒด๋ค
์์๋ ๋ง์ฒ๋ผ ์ด ๋ง์ด ํจ์ฌ ๋ช ํํ๋ค์! ์ฝ๋ ์์ ๊น์ง ์ธ๊ธํ์ฌ ๋ฆฌ๋ทฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์์ ๋ณด์ํ ๊ฒ์! ๋ง์ง๋ง์ Promise.all ๊ด๋ จํ์ฌ reject๊ฐ ๋ฐ์ํ ๋๋ ๊ทธ๋๋ก ์งํ๋์ง๋ง Promise ๊ฒฐ๊ณผ๊ฐ ์ ๋ด๊ธด ์์๋ค๋ ๋ฉ๋ฌ์ ๋ด๊ธฐ์ง ์๋๋ค๋ ์ฌ์ค์ ์๊ฐ์ง ๋ชปํ๋ค์... ๋ด์ฉ ์ข ์ฐธ๊ณ ํ๊ฒ ์ต๋๋ค
ํฌ๋ก์์๊ณผ ์ปคํผ์์ด์ฝ์ VSCode์์ emoji ์ฐ๋ ๊ฑธ ์ด์ ์์์ใ ใ ใ ใ ใ ใ ์ ๋์ ํด๋ดค์ต๋๋ค. ์ผ๋ฅธ ์ฝ๋ก๋กฑ์ด ์ข ์ ์ ํด์ ธ์ ์คํฐ๋ ์คํ๋ชจ์ ๊ฐ์ง๋ฉด ๊ฐ์ด ์ปคํผ๋ ๋นต ๋จน๊ณ ์ถ๋ค์ ๐ง
- Sync Async
- ๋ธ๋ผ์ฐ์ ์ JS ์ฝ๋ ์คํ๊ณผ์
- ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ
- ์ฝ๋ฐฑ
- Promise
- [es2015+] ์ก์ค(Jobs)
- ๋น๋๊ธฐ ํจ์ Async Await
- Async Iterator
- Async Generator
- Async Iterable
- ์๋ฌ ํธ๋ค๋ง
[์ง๋ฌธ]
๋ง์ง๋ง์ ๋ถ๋ด๋ถ๋ด ํ๋๋ผ ์ ๊ฒฐ๊ณผ๋ฌผ ์์ธ์ฒ๋ฆฌ์ชฝ ๋ด์ฉ์ด ๋ถ์คํ๋ฐ ์์๋ ๊ธ์ด ๋ง์ด ๋์์ด ๋์ด์ ๋ด์ฉ์ ์ถ๊ฐ/์์ ํ๊ณ ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
๋ถ๋ถ์์ ์๋ ์ฝ๋๊ฐ user ์์ let์ ๋ถ์ด๋ ๊ฑธ ์์ด ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ์ค๋ช ํด์ฃผ์ จ๋๋ฐ์ ์ด๋ ๊ฒ let์ผ๋ก ์ ์ธํ ๋ณ์๋ฅผ ๋ณ์ ์ ์ธ ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ์ง ์๊ณ ์ ์ญ๋ณ์(?)๋ก ๋ฐ์๋ฒ๋ฆฌ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฌด์กฐ๊ฑด ์๋ฌ๊ฐ ๋ฐ์ํ๋์?
let json = '{ "age": 30 }'; // ๋ถ์์ ํ ๋ฐ์ดํฐ
try {
user = JSON.parse(json); // <-- user ์์ let์ ๋ถ์ด๋ ๊ฑธ ์์๋ค์.
// ...
} catch (err) {
alert('JSON Error: ' + err); // JSON Error: ReferenceError: user is not defined
// (์ค์ ๋ก JSON Error๊ฐ ์๋๋๋ค.)
}
๊ฐ์ ํํธ์ ์๋ ๋์์๋ ์ฝ๋ ์์ ์์์, user ์์ let์ ๋ถ์ด์ง ์์ ๋ฐ์ํ๋ ๊ฒฝ์ฐ์ธ๋ฐ ์ฝ๋์ user ์์ let์ด ์ ๋ถ์ด์๋๊ฑด๊ฐ์...?!
user ์์ let ์ ๋ถ์ด์ง ์์ ๋ฐ์ํ๋ ReferenceError ๋ ์ธ๋ถ์์ ์ฒ๋ฆฌํ๋๋ก catch ๋ธ๋ก์์ throw ๋ฅผ ํ๋ฒ ๋ ํด์ค๋ค.
let json = '{ "age": 30 }'; // ๋ถ์์ ํ ๋ฐ์ดํฐ
try {
let user = JSON.parse(json);
if (!user.name) throw new SyntaxError('๋ถ์์ ํ ๋ฐ์ดํฐ: ์ด๋ฆ ์์');
blabla(); // ์์์น ๋ชปํ ์๋ฌ
alert(user.name);
} catch (e) {
if (e instanceof SyntaxError) {
alert('JSON Error: ' + e.message);
} else {
throw e; // ์๋ฌ ๋ค์ ๋์ง๊ธฐ (*)
}
}
[๋ต๋ณ]
@pul8219
const json = '{ "age": 30 }'; // ๋ถ์์ ํ ๋ฐ์ดํฐ
try {
user = JSON.parse(json); // <-- user ์์ let์ ๋ถ์ด๋ ๊ฑธ ์์๋ค์.
// ...
} catch (err) {
alert('JSON Error: ' + err); // JSON Error: ReferenceError: user is not defined
// (์ค์ ๋ก JSON Error๊ฐ ์๋๋๋ค.)
}
์ผ๋ก ์ ์ ํ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ์คํํ ๋์๋ 'use strict' ๋ฅผ ๋งจ์์ ๋ถ์ฌ์ฃผ์ ์ผ ์ ์ญ๋ณ์๋ก ๋ฐ์ธ๋ฉ ๋์ง ์์ต๋๋ค. ์ ์ญ ๋ณ์๋ก ๋ฐ์ธ๋ฉ ๋ ๋๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ง๋ง, ES6 ๋ถํฐ๋ ๋ณ์์์ ํค์๋(const, let, var )๋ฅผ ์ ์ธํด ์ฃผ์ง ์์ผ๋ฉด ์ ์ญ๋ณ์๋ก ๋ฐ์ธ๋ฉ ๋์ง ์๊ณ Reference ์๋ฌ๊ฐ ๋๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค
์ ๊ฐ ์๋ฌด์๊ฐ์์ด ๊ณต๋ถํ๋ค๋ณด๋ ์ค์๊ฐ ๋ฐ์ํ๋ค์ ์ ์ ๊ฐ์ฌํฉ๋๋ค!
https://github.com/khw970421/js-interview/blob/master/const/project8.md
[์ง๋ฌธ]
๋ด์ฉ ๊ฐ๊ฒฐํ๋ฉด์ ํ์ํ๋ถ๋ถ์ ์ดํดํ ์์์ด์ ์ข์์ต๋๋ค.
๋๋ถ์ Promise๋ถ๋ถ ์์ ํ๋๋ฐ ์ข ๋์์ด ๋์์ต๋๋ค.
์ฒ์ ์ฝ๋๋ถ๋ถ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋ ์ ๊ฐ์ ๋ด์ฉ์ ๋ค๋ฃจ๋๊ฒ ์ ๋ํ ํ์์ ๊ตฌ๋ถ์ง์ด์ ์ฐจ์ด์ ์ ์์๋ณด๋๊ฒ์ด ์ต์ํด ์ฐจ์ด์ ์ ๋ณด๋๋ฐ ์ดํดํ๊ธฐ ์ฌ์ ์ต๋๋ค.
Promise๊ด๋ จํด์ https://github.com/khw970421/js-interview/blob/master/const/project8.md ์ ์ ์ ๋ฆฌ๋ ๋์์ด ๋์์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
[๋ต๋ณ] @khw970421 ๋ฆฌ๋ทฐ ๊ฐ์ฌํฉ๋๋ค. ํ์ ํ์ฑ๋ ํ์๋ ๊ฒ์ฒ๋ผ ์ฝ๋๋ฅผ ๊ฒฝ์ฐ๋ณ๋ก ๋๋๊ฑฐ๋ ๋ฐ์ ์ํค๋๊ฒ ์ดํดํ๋๋ฐ ์ข์ ๊ฒ ๊ฐ์์! ํ์ฑ๋ ์ ๋ฆฌ๋ ์ ๋ดค์ต๋๋ค ๋ฌธ์ ์์ ์ ์ฐธ๊ณ ํ ๊ฒ์~
[์ง๋ฌธ]
๋งํฌ๋ค์ด์ผ๋ก ์์ฑํ์ จ๊ตฐ์! ์๋๋ ์ข์๋๋ฐ ๊ฐ๋ ์ฑ์ด ๋๋ ์ข์์ง ๊ฒ ๊ฐ์์ step8 ์ ์ฝ์์ต๋๋ค ๐ ์ ๊ฒฐ๊ณผ๋ฌผ์ ๋จ๊ฒจ์ฃผ์ ๋ฆฌ๋ทฐ๋ณด๊ณ ํ์ฑ๋ ๋ฌธ์์ค Promise ๋ถ๋ถ๋ ์ ๋ ํ์ต๋๋ค.
[์ง๋ฌธ-์์]
์๋ฌ์๋ ๋ฌธ๋ฒ ์๋ฌ, ๋ฐํ์ ์๋ฌ, ๋
ผ๋ฆฌ์ ์๋ฌ๊ฐ ์๋.
๋ฌธ๋ฒ ์๋ฌ
console.log(;
๋ฐํ์ ์๋ฌ
๋ฐฐ์ด ์ธ๋ฑ์ค ๋ฒ์
์๋ชป๋ ๊ณต๊ฐ์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ
0์ผ๋ก ๋๋๋ ๊ฒ
๋
ผ๋ฆฌ์ ์๋ฌ
์คํ์ ์ค๋ฅx
์ํ๋ ๊ฒฐ๊ณผ๊ฐ ์๋๋
์๋ฌ์ ์ข ๋ฅ์ ๋ํด ๊ณต๋ถํ์ ์ ์ด ์ํ์ ๊ฒ ๊ฐ์์
constructor ๋ฅผ ํตํด์ ์๋ฌ๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ๋ ์๊ตฐ์.
try {
console.log('์ ์คํ๋ฉ๋๋ค.');
console.log(v);
console.log('๋ฒ๋ ค์ง');
} catch (e) {
switch (e.constructor) {
case SyntaxError:
console.log('์์คํ');
break;
case ReferenceError:
console.log(e.constructor);
console.log('์คํ');
break;
}
}
์ถ๊ฐ์ ์ผ๋ก if (e instanceof SyntaxError) ์ด์ฒ๋ผ instanceof ๋ฅผ ์ฌ์ฉํ๋ฉด SyntaxError ๋ฅผ ์์ํ ์๋ฌ๋ ์ก์ ์ ์๋ ํน์ง์ด ์์ต๋๋ค.
https://github.com/quavious/hell_script/blob/master/chapter8.js
[์ง๋ฌธ-์์]
console.dir ๋ฉ์๋๋ ๋ช
์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ์ ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ถ๋ ฅํด์ค๋ค.
์น์์๋ง ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋ค. NodeJS์์ ์คํ์ log ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
[์ง๋ฌธ-์์]
ES6์ ๋ฑ์ฅํ Promise ๋ฅผ ์ด์ฉํ ๋ฐฉ์์ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ Promise ์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ์ฝ๋ฐฑ ํจ์๋ ํธ์ถํ ๋ ๋ฐ๋ก ์คํ๋์ง๋ง
๊ทธ ๋ด๋ถ์ resolve ๋๋ reject ํจ์๋ฅผ ํธ์ถํ๋ ๊ตฌ๋ฌธ์ด ์์ ๊ฒฝ์ฐ ๋ ์ค ํ๋๊ฐ ์คํ๋๊ธฐ ์ ๊น์ง๋ then ๋๋ catch ๊ตฌ๋ฌธ์ผ๋ก ๋์ด๊ฐ์ง ์๋๋ค.