본ì¸ì ì주 ì ëª í ê°ìë¼ê³ ê°ì í´ ë´ ìë¤. ê·¸ë¦¬ê³ í ê°ìì¸ ë³¸ì¸ì´ ë°¤, ë®ì¼ë¡ ë¤ì ì±ê¸ ì¨ë²ì´ ì¸ì ëì¤ëì§ ë¬¼ì´ë³´ë í¬ë¤ì ìëí´ì¼ íë¤ê³ í´ ë´ ìë¤.
ë¹ì ì ì¨ë²ì´ ì¶ìëë©´ í¬ë¤ì´ ìëì¼ë¡ ììì ë°ìë³¼ ì ìëë¡ í´ ë¶í를 ë ê²ëë¤. 구ë 리ì¤í¸ë¥¼ íë ë§ë¤ì´ í¬ë¤ìê² ì ë¬í´ ì´ë©ì¼ 주ì를 ì ê² íê³ , ì¨ë²ì´ ì¤ë¹ëë©´ 리ì¤í¸ì ìë í¬ë¤ìê² ë©ì¼ì ë³´ë´ ì¨ë² ê´ë ¨ ììì ë°ë¡ ë°ìë³¼ ì ìê² íë ìì¼ë¡ ë§ì´ì£ . ì´ë ê² íë©´ ë ¹ì ì¤íëì¤ì íì¬ê° ë°ìí´ì ì¶ì ìì ì¸ ì¨ë²ì´ ì·¨ìëë ë¶ìì¬ê° ë°ìí´ë ê´ë ¨ ììì í¬ë¤ìê² ì ë¬ í ì ììµëë¤.
ì´ì 모ëê° íë³µí´ì¡ìµëë¤. ë°¤ë®ì¼ë¡ ì§ë¬¸ì íë í¬ì´ ì¬ë¼ì¡ê³ , í¬ë¤ì ì¨ë² ì¶ì를 ëì¹ì§ ìì ì ìê² ëìì¼ëê¹ì.
ì´ ë¹ì ë ì½ë를 ìì±íë©´ì ì주 ë§ëë ìí©ì ì¤ì ì¼ì´ë ë²í ì¼ë¡ ë°ê¾¼ ê²ì ëë¤. ë°ë¡ ìë ê°ì ìí© ë§ì´ì£ .
- 'ì ì ì½ë(producing code)'ë ì격ìì ì¤í¬ë¦½í¸ë¥¼ ë¶ë¬ì¤ë ê² ê°ì ìê°ì´ 걸리ë ì¼ì í©ëë¤. ì ë¹ì ìì 'ê°ìâê° ì ì ì½ëì í´ë¹í©ëë¤.
- 'ìë¹ ì½ë(consuming code)'ë 'ì ì ì½ëâì 결과를 기ë¤ë ¸ë¤ê° ì´ë¥¼ ìë¹í©ëë¤. ì´ë ìë¹ ì£¼ì²´(í¨ì)ë ì¬ë¿ì´ ë ì ììµëë¤. ì ë¹ì ìì ìë¹ ì½ëë 'í¬âì ëë¤.
- íë¼ë¯¸ì¤(promise) ë 'ì ì ì½ëâì 'ìë¹ ì½ëâ를 ì°ê²°í´ 주ë í¹ë³í ìë°ì¤í¬ë¦½í¸ ê°ì²´ì ëë¤. ì ë¹ì ìì íë¼ë¯¸ì¤ë '구ë 리ì¤í¸âì ëë¤. 'íë¼ë¯¸ì¤âë ìê°ì´ ì¼ë§ë 걸리ë ìê´ìì´ ì½ìí 결과를 ë§ë¤ì´ ë´ë 'ì ì ì½ëâê° ì¤ë¹ëìì ë, 모ë ìë¹ ì½ëê° ê²°ê³¼ë¥¼ ì¬ì©í ì ìëë¡ í´ì¤ëë¤.
ì¬ì¤ íë¼ë¯¸ì¤ë 구ë 리ì¤í¸ë³´ë¤ í¨ì¬ ë³µì¡í기 ë문ì, ì ë¹ì ê° ìë²½íê² ë¤ì´ë§ì§ë ììµëë¤. íë¼ë¯¸ì¤ì ë ë§ì 기ë¥ì´ ìê³ , íê³ë ììµëë¤. íì§ë§ ì¼ë¨ ì´ ë¹ì 를 ì´ì©í´ íë¼ë¯¸ì¤ë¥¼ íìµí´ë³´ëë¡ í©ìë¤.
promise ê°ì²´ë ìëì ê°ì 문ë²ì¼ë¡ ë§ë¤ ì ììµëë¤.
let promise = new Promise(function(resolve, reject) {
// executor (ì ì ì½ë, 'ê°ì')
});
new Promiseì ì ë¬ëë í¨ìë executor(ì¤íì, ì¤í í¨ì) ë¼ê³ ë¶ë¦
ëë¤. executorë new Promiseê° ë§ë¤ì´ì§ ë ìëì¼ë¡ ì¤íëëë°, 결과를 ìµì¢
ì ì¼ë¡ ë§ë¤ì´ë´ë ì ì ì½ë를 í¬í¨í©ëë¤. ì ë¹ì ìì 'ê°ìâê° ë°ë¡ executorì
ëë¤.
executorì ì¸ì resolveì rejectë ìë°ì¤í¬ë¦½í¸ìì ìì²´ ì ê³µíë ì½ë°±ì
ëë¤. ê°ë°ìë resolveì reject를 ì ê²½ ì°ì§ ìê³ executor ì ì½ëë§ ìì±íë©´ ë©ëë¤.
ëì executorìì 결과를 ì¦ì ì»ë ë¦ê² ì»ë ìê´ìì´ ìí©ì ë°ë¼ ì¸ìë¡ ëê²¨ì¤ ì½ë°± ì¤ íë를 ë°ëì í¸ì¶í´ì¼ í©ëë¤.
resolve(value)â ì¼ì´ ì±ê³µì ì¼ë¡ ëë ê²½ì° ê·¸ 결과를 ëíë´ëvalueì í¨ê» í¸ì¶reject(error)â ìë¬ ë°ì ì ìë¬ ê°ì²´ë¥¼ ëíë´ëerrorì í¨ê» í¸ì¶
ìì½íë©´ ë¤ìê³¼ ê°ìµëë¤. executorë ìëì¼ë¡ ì¤íëëë° ì¬ê¸°ì ìíë ì¼ì´ ì²ë¦¬ë©ëë¤. ì²ë¦¬ê° ëëë©´ executorë ì²ë¦¬ ì±ê³µ ì¬ë¶ì ë°ë¼ resolveë reject를 í¸ì¶í©ëë¤.
íí¸, new Promise ìì±ìê° ë°ííë promise ê°ì²´ë ë¤ìê³¼ ê°ì ë´ë¶ íë¡í¼í°ë¥¼ ê°ìµëë¤.
stateâ ì²ìì"pending"(ë³´ë¥)ì´ìë¤resolveê° í¸ì¶ëë©´"fulfilled",rejectê° í¸ì¶ëë©´"rejected"ë¡ ë³í©ëë¤.resultâ ì²ììundefinedì´ìë¤resolve(value)ê° í¸ì¶ëë©´valueë¡,reject(error)ê° í¸ì¶ëë©´errorë¡ ë³í©ëë¤.
ë°ë¼ì executorë ìë 그림과 ê°ì´ promiseì ìí를 ë ì¤ íëë¡ ë³íìíµëë¤.
'í¬ë¤âì´ ì´ë»ê² ì´ ë³í를 구ë í ì ìëì§ì ëí´ì ì¡°ê¸ íì ì´í´ë³´ê² ìµëë¤.
ê·¸ ì ì promise ìì±ìì ê°ë¨í executor í¨ìë¡ ë§ë ìì를 ì´í´ë´
ìë¤. setTimeoutì ì´ì©í´ executor í¨ìë ì½ê°ì ìê°ì´ 걸리ëë¡ êµ¬íí´ ë³´ììµëë¤.
let promise = new Promise(function(resolve, reject) {
// íë¼ë¯¸ì¤ê° ë§ë¤ì´ì§ë©´ executor í¨ìë ìëì¼ë¡ ì¤íë©ëë¤.
// 1ì´ ë¤ì ì¼ì´ ì±ê³µì ì¼ë¡ ëë¬ë¤ë ì í¸ê° ì ë¬ëë©´ì resultë 'ìë£'ê° ë©ëë¤.
setTimeout(() => resolve("ìë£"), 1000);
});
ì ìì를 íµí´ì ì°ë¦¬ê° ì ì ìë ê²ì ë ê°ì§ì ëë¤.
-
executorë
new Promiseì ìí´ ìëì¼ë¡ ê·¸ë¦¬ê³ ì¦ê°ì ì¼ë¡ í¸ì¶ë©ëë¤. -
executorë ì¸ìë¡
resolveìrejectí¨ì를 ë°ìµëë¤. ì´ í¨ìë¤ì ìë°ì¤í¬ë¦½í¸ ìì§ì´ 미리 ì ìí í¨ìì´ë¯ë¡ ê°ë°ìê° ë°ë¡ ë§ë¤ íìê° ììµëë¤. ë¤ë§,resolveërejectì¤ íëë ë°ëì í¸ì¶í´ì¼ í©ëë¤.executor 'ì²ë¦¬âê° ìì ë ì§ 1ì´ í,
resolve("ìë£")ì´ í¸ì¶ëê³ ê²°ê³¼ê° ë§ë¤ì´ì§ëë¤. ì´ëpromiseê°ì²´ì ìíë ë¤ìê³¼ ê°ì´ ë³í©ëë¤.
ì´ì²ë¼ ì¼ì´ ì±ê³µì ì¼ë¡ ì²ë¦¬ëìì ëì íë¼ë¯¸ì¤ë 'fulfilled promise(ì½ìì´ ì´íë íë¼ë¯¸ì¤)'ë¼ê³ ë¶ë¦½ëë¤.
ì´ë²ìë executorê° ìë¬ì í¨ê» ì½ìí ìì ì ê±°ë¶íë ê²½ì°ì ëí´ ì´í´ë´ ìë¤.
let promise = new Promise(function(resolve, reject) {
// 1ì´ ë¤ì ìë¬ì í¨ê» ì¤íì´ ì¢
ë£ëìë¤ë ì í¸ë¥¼ ë³´ë
ëë¤.
setTimeout(() => reject(new Error("ìë¬ ë°ì!")), 1000);
});
1ì´ í reject(...)ê° í¸ì¶ëë©´ promiseì ìíê° "rejected"ë¡ ë³í©ëë¤.
ì§ê¸ê¹ì§ ë°°ì´ ë´ì©ì ìì½í´ ë´
ìë¤. executorë ë³´íµ ìê°ì´ 걸리ë ì¼ì ìíí©ëë¤. ì¼ì´ ëëë©´ resolveë reject í¨ì를 í¸ì¶íëë°, ì´ë íë¼ë¯¸ì¤ ê°ì²´ì ìíê° ë³íí©ëë¤.
ì´í(resolved) í¹ì ê±°ë¶(rejected) ìíì íë¼ë¯¸ì¤ë âì²ë¦¬ë(settled)â íë¼ë¯¸ì¤ë¼ê³ ë¶ë¦ ëë¤. ë°ëëë íë¼ë¯¸ì¤ë¡ 'ë기(pending)'ìíì íë¼ë¯¸ì¤ê° ììµëë¤.
executorë resolveë reject ì¤ íë를 ë°ëì í¸ì¶í´ì¼ í©ëë¤. ì´ë ë³ê²½ë ìíë ë ì´ì ë³íì§ ììµëë¤.
ì²ë¦¬ê° ëë íë¼ë¯¸ì¤ì resolveì reject를 í¸ì¶íë©´ 무ìëì£ .
let promise = new Promise(function(resolve, reject) {
resolve("ìë£");
reject(new Error("â¦")); // 무ìë¨
setTimeout(() => resolve("â¦")); // 무ìë¨
});
ì´ë ê² executorì ìí´ ì²ë¦¬ê° ëë ì¼ì ê²°ê³¼ í¹ì ìë¬ë§ ê°ì§ ì ììµëë¤.
ì¬ê¸°ì ëíì¬ resolveë rejectë ì¸ì를 íëë§ ë°ê³ (í¹ì ì무ê²ë ë°ì§ ìì) ê·¸ ì´ì¸ì ì¸ìë 무ìíë¤ë í¹ì±ë ììµëë¤.
Error ê°ì²´ì í¨ê» ê±°ë¶í기무ì¸ê° ì못ë ê²½ì°, executorë reject를 í¸ì¶í´ì¼ í©ëë¤. ì´ë ì¸ìë resolveì ë§ì°¬ê°ì§ë¡ ì´ë¤ íì
ë ê°ë¥íì§ë§ Error ê°ì²´ ëë Error를 ììë°ì ê°ì²´ë¥¼ ì¬ì©í ê²ì ì¶ì²í©ëë¤. ì´ì ë ë¤ìì ì¤ëª
íê² ìµëë¤.
resolve·reject í¨ì ì¦ì í¸ì¶í기executorë ëê° ë¬´ì¸ê°ë¥¼ ë¹ë기ì ì¼ë¡ ìííê³ , ì½ê°ì ìê°ì´ ì§ë íì resolve, reject를 í¸ì¶íëë°, ê¼ ì´ë ê² í íìë ììµëë¤. ìëì ê°ì´ resolveë reject를 ì¦ì í¸ì¶í ìë ììµëë¤.
let promise = new Promise(function(resolve, reject) {
// ì¼ì ëë§ì¹ë ë° ìê°ì´ ë¤ì§ ìì
resolve(123); // ê²°ê³¼(123)를 ì¦ì resolveì ì ë¬í¨
});
ì´ë¤ ì¼ì ììíëë° ìê³ ë³´ë ì¼ì´ ì´ë¯¸ ëë ì ì¥ê¹ì§ ëì´ìë ê²½ì°, ì´ë ê² resolveë reject를 ì¦ì í¸ì¶íë ë°©ìì ì¬ì©í ì ììµëë¤.
ì´ë ê² íë©´ íë¼ë¯¸ì¤ë ì¦ì ì´í ìíê° ë©ëë¤.
stateì resultë ë´ë¶ì ììµëë¤.íë¼ë¯¸ì¤ ê°ì²´ì state, result íë¡í¼í°ë ë´ë¶ íë¡í¼í°ì´ë¯ë¡ ê°ë°ìê° ì§ì ì ê·¼í ì ììµëë¤. .then/.catch/.finally ë©ìë를 ì¬ì©íë©´ ì ê·¼ ê°ë¥íë°, ìì¸í ë´ì©ì ìëìì ì´í´ë³´ê² ìµëë¤.
ìë¹ì: then, catch, finally
íë¼ë¯¸ì¤ ê°ì²´ë executor(âì ì ì½ëâ í¹ì âê°ìâ)ì ê²°ê³¼ë ìë¬ë¥¼ ë°ì ìë¹ í¨ì(âí¬â)를 ì´ì´ì£¼ë ìí ì í©ëë¤. ìë¹í¨ìë .then, .catch, .finally ë©ìë를 ì¬ì©í´ ë±ë¡(구ë
)ë©ëë¤.
then
.thenì íë¼ë¯¸ì¤ìì ê°ì¥ ì¤ìíê³ ê¸°ë³¸ì´ ëë ë©ìëì
ëë¤.
문ë²ì ë¤ìê³¼ ê°ìµëë¤.
promise.then(
function(result) { /* ê²°ê³¼(result)를 ë¤ë£¹ëë¤ */ },
function(error) { /* ìë¬(error)를 ë¤ë£¹ëë¤ */ }
);
.thenì 첫 ë²ì§¸ ì¸ìë íë¼ë¯¸ì¤ê° ì´íëìì ë ì¤íëë í¨ìì´ê³ , ì¬ê¸°ì ì¤í 결과를 ë°ìµëë¤.
.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(function(resolve, reject) {
setTimeout(() => reject(new Error("ìë¬ ë°ì!")), 1000);
});
// reject í¨ìë .thenì ë ë²ì§¸ í¨ì를 ì¤íí©ëë¤.
promise.then(
result => alert(result), // ì¤íëì§ ìì
error => alert(error) // 1ì´ í "Error: ìë¬ ë°ì!"ì ì¶ë ¥
);
ìì
ì´ ì±ê³µì ì¼ë¡ ì²ë¦¬ë ê²½ì°ë§ ë¤ë£¨ê³ ì¶ë¤ë©´ .thenì ì¸ì를 íëë§ ì ë¬íë©´ ë©ëë¤.
let promise = new Promise(resolve => {
setTimeout(() => resolve("ìë£!"), 1000);
});
promise.then(alert); // 1ì´ ë¤ "ìë£!" ì¶ë ¥
catch
ìë¬ê° ë°ìí ê²½ì°ë§ ë¤ë£¨ê³ ì¶ë¤ë©´ .then(null, errorHandlingFunction)ê°ì´ nullì 첫 ë²ì§¸ ì¸ìë¡ ì ë¬íë©´ ë©ëë¤. .catch(errorHandlingFunction)를 ì¨ë ëëë°, .catchë .thenì nullì ì ë¬íë ê²ê³¼ ëì¼íê² ìëí©ëë¤.
let promise = new Promise((resolve, reject) => {
setTimeout(() => reject(new Error("ìë¬ ë°ì!")), 1000);
});
// .catch(f)ë promise.then(null, f)ê³¼ ëì¼íê² ìëí©ëë¤
promise.catch(alert); // 1ì´ ë¤ "Error: ìë¬ ë°ì!" ì¶ë ¥
.catch(f)ë 문ë²ì´ ê°ê²°íë¤ë ì ë§ ë¹¼ê³ .then(null,f)ê³¼ ìë²½íê² ê°ìµëë¤.
finally
try {...} catch {...}ì finally ì ì´ ìë ê²ì²ë¼, íë¼ë¯¸ì¤ìë finallyê° ììµëë¤.
íë¼ë¯¸ì¤ê° ì²ë¦¬ëë©´(ì´íì´ë ê±°ë¶) fê° íì ì¤íëë¤ë ì ìì .finally(f) í¸ì¶ì .then(f, f)ê³¼ ì ì¬í©ëë¤.
ì¸ëª¨ê° ìì´ì§ ë¡ë© ì¸ëì¼ì´í°(loading indicator)를 ë©ì¶ë ê²½ì°ê°ì´, ê²°ê³¼ê° ì´ë»ë ë§ë¬´ë¦¬ê° íìíë©´ finallyê° ì ì©í©ëë¤.
ì¬ì©ë²ì ìëì ê°ìµëë¤.
new Promise((resolve, reject) => {
/* ìê°ì´ 걸리ë ì´ë¤ ì¼ì ìííê³ , ê·¸ í resolve, reject를 í¸ì¶í¨ */
})
// ì±ê³µÂ·ì¤í¨ ì¬ë¶ì ìê´ìì´ íë¼ë¯¸ì¤ê° ì²ë¦¬ëë©´ ì¤íë¨
.finally(() => ë¡ë© ì¸ëì¼ì´í° ì¤ì§)
.then(result => resultì err ë³´ì¬ì¤ => error ë³´ì¬ì¤)
ê·¸ë°ë° finallyë .then(f, f)ê³¼ ìì í ê°ì§ ììµëë¤. ì°¨ì´ì ì ë¤ìê³¼ ê°ìµëë¤.
-
finallyí¸ë¤ë¬ì ì¸ìê° ììµëë¤.finallyìì íë¼ë¯¸ì¤ê° ì´íëìëì§, ê±°ë¶ëìëì§ ì ì ììµëë¤.finallyìì ì 차를 ë§ë¬´ë¦¬íë âë³´í¸ì â ëìì ìíí기 ë문ì ì±ê³µÂ·ì¤í¨ ì¬ë¶ë¥¼ 몰ë¼ë ë©ëë¤. -
finallyí¸ë¤ë¬ë ìëì¼ë¡ ë¤ì í¸ë¤ë¬ì ê²°ê³¼ì ìë¬ë¥¼ ì ë¬í©ëë¤.resultê°
finally를 ê±°ì³thenê¹ì§ ì ë¬ëë ê²ì íì¸í´ë´ ìë¤.new Promise((resolve, reject) => { setTimeout(() => resolve("ê²°ê³¼"), 2000) }) .finally(() => alert("íë¼ë¯¸ì¤ê° ì¤ë¹ëììµëë¤.")) .then(result => alert(result)); // <-- .thenìì result를 ë¤ë£° ì ììíë¼ë¯¸ì¤ìì ìë¬ê° ë°ìíê³ ì´ ìë¬ê°
finally를 ê±°ì³catchê¹ì§ ì ë¬ëë ê²ì íì¸í´ë´ ìë¤.new Promise((resolve, reject) => { throw new Error("ìë¬ ë°ì!"); }) .finally(() => alert("íë¼ë¯¸ì¤ê° ì¤ë¹ëììµëë¤.")) .catch(err => alert(err)); // <-- .catchìì ìë¬ ê°ì²´ë¥¼ ë¤ë£° ì ììfinallyë íë¼ë¯¸ì¤ 결과를 ì²ë¦¬í기 ìí´ ë§ë¤ì´ ì§ ê² ìëëë¤. íë¼ë¯¸ì¤ ê²°ê³¼ëfinally를 íµê³¼í´ì ì ë¬ëì£ . ì´ë° í¹ì§ì ì주 ì ì©íê² ì¬ì©ë기ë í©ëë¤.íë¼ë¯¸ì¤ ì²´ì´ëê³¼ í¸ë¤ë¬ ê° ê²°ê³¼ ì ë¬ì ëí´ì ë¤ì ì±í°ìì ë ì´ì¼ê¸° ëëëë¡ íê² ìµëë¤.
-
.finally(f)ë í¨ìf를 ì¤ë³µí´ì ì¸ íìê° ì기 ë문ì.then(f, f)ë³´ë¤ ë¬¸ë² ì¸¡ë©´ìì ë í¸ë¦¬í©ëë¤.
íë¼ë¯¸ì¤ê° ë기 ìíì¼ ë, .then/catch/finally í¸ë¤ë¬ë íë¼ë¯¸ì¤ê° ì²ë¦¬ë길 기ë¤ë¦½ëë¤. ë°ë©´, íë¼ë¯¸ì¤ê° ì´ë¯¸ ì²ë¦¬ìíë¼ë©´ í¸ë¤ë¬ê° ì¦ê° ì¤íë©ëë¤.
// ìë íë¼ë¯¸ì¤ë ìì±ê³¼ ëìì ì´íë©ëë¤.
let promise = new Promise(resolve => resolve("ìë£!"));
promise.then(alert); // ìë£! (ë°ë¡ ì¶ë ¥ë¨)
ê°ìì í¬, 구ë 리ì¤í¸ ìë리ì¤ë³´ë¤ íë¼ë¯¸ì¤ê° ë ë³µì¡íë¤ê³ ë§í ì´ì ê° ë°ë¡ ì´ë° ê¸°ë¥ ë문ì ëë¤. ê°ìê° ì 곡ì ë°íí ì´íì 구ë 리ì¤í¸ì ì´ë¦ì ì¬ë¦¬ë í¬ì ì 곡 ë°í ì¬ë¶ë¥¼ ì ì ììµëë¤. 구ë 리ì¤í¸ì ì´ë¦ì ì¬ë¦¬ë ê²ì´ ì íëì´ì¼ ìë¡ì´ ììì ë°ì ì ì기 ë문ì´ì£ .
ê·¸ë°ë° íë¼ë¯¸ì¤ë í¸ë¤ë¬ë¥¼ ì¸ì ë ì¶ê°í ì ìë¤ë ì ìì 구ë 리ì¤í¸ ìë리ì¤ë³´ë¤ ë ì ì°í©ëë¤. ê²°ê³¼ê° ëì ìë ìíììë í¸ë¤ë¬ë¥¼ ë±ë¡íë©´ 결과를 ë°ë¡ ë°ì ì ììµëë¤.
ì´ì ì¤ì ëìíë ìì를 ë³´ë©° íë¼ë¯¸ì¤ë¡ ì´ë»ê² ë¹ë기 ëìì ì²ë¦¬íëì§ ì´í´ë´ ìë¤.
ìì: loadScript
ì´ì ì±í°ìì ì¤í¬ë¦½í¸ ë¡ë©ì ì¬ì©ëë í¨ì loadScript를 ìì±í´ ë³´ììµëë¤.
ë³µìµ ì°¨ììì ì½ë°± 기ë°ì¼ë¡ ìì±í í¨ì를 ë¤ì ì´í´ë´ ìë¤.
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);
}
ì´ì íë¼ë¯¸ì¤ë¥¼ ì´ì©í´ í¨ì를 ë¤ì ìì±í´ ë´ ìë¤.
ìë¡ì´ í¨ììì ì½ë°± í¨ì ëì , ì¤í¬ë¦½í¸ ë¡ë©ì´ ìì í ëë¬ì ë ì´íëë íë¼ë¯¸ì¤ ê°ì²´ë¥¼ ë§ë¤ê³ , ì´ë¥¼ ë°íí´ ë³´ê² ìµëë¤. ì¸ë¶ ì½ëìì .thenì ì´ì©í´ í¸ë¤ë¬(구ë
í¨ì)를 ëíê² ìµëë¤.
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('ëë¤ë¥¸ í¸ë¤ë¬...'));
íë¼ë¯¸ì¤ë¥¼ ì¬ì©í ì½ëê° ì½ë°± ê¸°ë° ì½ëë³´ë¤ ë ëì ì ì ì 리íë©´ ë¤ìê³¼ ê°ìµëë¤.
| íë¼ë¯¸ì¤ | ì½ë°± |
|---|---|
íë¼ë¯¸ì¤ë¥¼ ì´ì©íë©´ íë¦ì´ ìì°ì¤ë½ìµëë¤. loadScript(script)ë¡ ì¤í¬ë¦½í¸ë¥¼ ì½ê³ , ê²°ê³¼ì ë°ë¼ ê·¸ë¤ì(.then)ì 무ìì í ì§ì ëí ì½ë를 ìì±íë©´ ë©ëë¤. |
loadScript(script, callback)를 í¸ì¶í ë, í¨ê» í¸ì¶í callback í¨ìê° ì¤ë¹ëì´ ìì´ì¼ í©ëë¤. loadScript를 í¸ì¶í기 ì´ì ì í¸ì¶ ê²°ê³¼ë¡ ë¬´ìì í ì§ ë¯¸ë¦¬ ìê³ ìì´ì¼ í©ëë¤. |
íë¼ë¯¸ì¤ì ìíë ë§í¼ .thenì í¸ì¶í ì ììµëë¤. .thenì í¸ì¶íë ê²ì ìë¡ì´ âí¬â(ìë¡ì´ 구ë
í¨ì)ì '구ë
리ì¤í¸âì ì¶ê°íë ê²ê³¼ ê°ìµëë¤. ìì¸í ë´ì©ì íë¼ë¯¸ì¤ ì²´ì´ëìì ë¤ë£¨ê² ìµëë¤. |
ì½ë°±ì íëë§ ê°ë¥í©ëë¤. |
íë¼ë¯¸ì¤ë¥¼ ì¬ì©íë©´ íë¦ì´ ìì°ì¤ë½ê³ ì ì°í ì½ë를 ìì±í ì ììµëë¤. ì´ ì¸ìë ë ë§ì ì¥ì ì´ ìëë°, ë¤ì ì±í°ìì ë ì´í´ë³´ê² ìµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.