Baseline Widely available *
Promise
ê°ì²´ë ë¹ë기 ìì
ì´ ë§ì´í 미ëì ìë£ ëë ì¤í¨ì ê·¸ ê²°ê³¼ ê°ì ëíë
ëë¤.
íë¡ë¯¸ì¤ì ìë ë°©ìê³¼ íë¡ë¯¸ì¤ ì¬ì© ë°©ë²ì ëí´ ììë³´ë ¤ë©´ 먼ì íë¡ë¯¸ì¤ ì¬ì©í기ì ì½ì´ë³´ì¸ì.
ì¤ëªPromise
ë íë¡ë¯¸ì¤ê° ìì±ë ìì ìë ìë ¤ì§ì§ ììì ìë ìë ê°ì ìí ë리ìë¡, ë¹ë기 ì°ì°ì´ ì¢
ë£ë ì´íì ê²°ê³¼ ê°ê³¼ ì¤í¨ ì¬ì 를 ì²ë¦¬í기 ìí ì²ë¦¬ê¸°ë¥¼ ì°ê²°í ì ììµëë¤. íë¡ë¯¸ì¤ë¥¼ ì¬ì©íë©´ ë¹ë기 ë©ìëìì ë§ì¹ ë기 ë©ìëì²ë¼ ê°ì ë°íí ì ììµëë¤. ë¤ë§ ìµì¢
결과를 ë°ííë ê²ì´ ìëê³ , 미ëì ì´ë¤ ìì ì 결과를 ì ê³µíê² ë¤ë 'íë¡ë¯¸ì¤(promise)'를 ë°íí©ëë¤.
Promise
ë ë¤ì ì¤ íëì ìí를 ê°ì§ëë¤.
ë기 ì¤ì¸ íë¡ë¯¸ì¤ë ê°ê³¼ í¨ê» ì´íí ìë, ì´ë¤ ì´ì (ì¤ë¥)ë¡ ì¸í´ ê±°ë¶ë ìë ììµëë¤. ì´íì´ë ê±°ë¶ë ë, íë¡ë¯¸ì¤ì then
ë©ìëì ìí´ ë기ì´(í)ì ì¶ê°ë ì²ë¦¬ê¸°ë¤ì´ í¸ì¶ë©ëë¤. ì´ë¯¸ ì´ííê±°ë ê±°ë¶ë íë¡ë¯¸ì¤ì ì²ë¦¬ê¸°ë¥¼ ì°ê²°í´ë í¸ì¶ëë¯ë¡, ë¹ë기 ì°ì°ê³¼ ì²ë¦¬ê¸° ì°ê²° ì¬ì´ì ê²½í© ì¡°ê±´ì ììµëë¤.
íë¡ë¯¸ì¤ê° ì´íëê±°ë ê±°ë¶ëìì§ë§ ë³´ë¥ ì¤ì´ ìë ê²½ì°, íë¡ë¯¸ì¤ê° íì ë ê²ì¼ë¡ ê°ì£¼í©ëë¤.
ëí íë¡ë¯¸ì¤ì í¨ê» resolvedë¼ë ì©ì´ê° ì¬ì©ëë ê²ì ë³¼ ì ìëë°, ì´ë íë¡ë¯¸ì¤ê° ë¤ë¥¸ íë¡ë¯¸ì¤ì ìµì¢ ìíì ì¼ì¹íëë¡ "settled"ëê±°ë "locked-in"ëì´ ë ì´ì í´ê²°íê±°ë ê±°ë¶í´ë ìë¬´ë° í¨ê³¼ê° ììì ì미í©ëë¤. States and fatesì íë¡ë¯¸ì¤ ì©ì´ì ëí ìì¸í ë´ì©ì´ ëì ììµëë¤. "resolved" íë¡ë¯¸ì¤ë ì¢ ì¢ "fulfilled" íë¡ë¯¸ì¤ì ëì¼íì§ë§, "States and fates"ì ì¤ëª ë ê²ì²ë¼ í´ê²°ë íë¡ë¯¸ì¤ë ë³´ë¥ ì¤ì´ê±°ë ê±°ë¶ë ì ììµëë¤. ë¤ìì ìì ì ëë¤.
new Promise((resolveOuter) => {
resolveOuter(
new Promise((resolveInner) => {
setTimeout(resolveInner, 1000);
}),
);
});
ì´ íë¡ë¯¸ì¤ë ìì±ë ë resolveOuter
ê° ë기ì ì¼ë¡ í¸ì¶ë기 ë문ì ì´ë¯¸ í´ê²°ëìì§ë§, ë¤ë¥¸ íë¡ë¯¸ì¤ì í¨ê» í´ê²°ëë¯ë¡ 1ì´ í ë´ë¶ íë¡ë¯¸ì¤ê° ì´íë ëê¹ì§ë ì´íëì§ ììµëë¤. ì¤ì ë¡ "resolution"ì ì¢
ì¢
백그ë¼ì´ëìì ì´ë£¨ì´ì§ë©° ê´ì°°í ì ìì¼ë©°, ì´í ëë ê±°ë¶ ì¬ë¶ë§ íì¸í ì ììµëë¤.
ì°¸ê³ : ëê¸í íê°ì ì°ì° ì°ê¸°ë¥¼ ìí ë°©ë²ì íë¡ë¯¸ì¤ë¼ê³ ë¶ë¥´ë ì¸ì´ë ì¬ë¿ ì¡´ì¬í©ëë¤(Scheme ë±). JavaScriptììì íë¡ë¯¸ì¤ë ì½ë°± í¨ì를 ì°ê²°í ì ìë, ì´ë¯¸ ì§í ì¤ì¸ íë¡ì¸ì¤ë¥¼ ëíë
ëë¤. ííìì ëê¸íê² íê°íë ¤ë©´ f = () => expression
ì²ë¼ 매ê°ë³ì ìë í¨ì를 ì¬ì©í´ ëê¸í ííìì ìì±íê³ , f()
를 í¸ì¶í´ íê°íì¸ì.
Promise.prototype.then()
, Promise.prototype.catch()
ë° Promise.prototype.finally()
ë©ìëë ì ì°©ë íë¡ë¯¸ì¤ì ì¶ê° ìì
ì ì°ê²°íë ë° ì¬ì©ë©ëë¤. ì´ë¬í ë©ìëë íë¡ë¯¸ì¤ë¥¼ ë°ííë¯ë¡ ì°ìì ì¼ë¡ ì°ê²°í ì ììµëë¤.
.then()
ë©ìëë ìµë ë ê°ì ì¸ì를 ë°ìµëë¤. 첫 ë²ì§¸ ì¸ìë íë¡ë¯¸ì¤ì ì´íë ê²½ì°ì ëí ì½ë°± í¨ìì´ê³ , ë ë²ì§¸ ì¸ìë ê±°ë¶ë ê²½ì°ì ëí ì½ë°± í¨ìì
ëë¤. ê° .then()
ì ìë¡ ìì±ë íë¡ë¯¸ì¤ ê°ì²´ë¥¼ ë°ííë©°, ì íì ì¼ë¡ ì°ìì ì¬ì©í ì ììµëë¤. ë¤ìì ìì ì
ëë¤.
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("foo");
}, 300);
});
myPromise
.then(handleFulfilledA, handleRejectedA)
.then(handleFulfilledB, handleRejectedB)
.then(handleFulfilledC, handleRejectedC);
.then()
ì íë¡ë¯¸ì¤ ê°ì²´ë¥¼ ë°ííë ì½ë°± í¨ìê° ìë ê²½ì°ìë ì²ë¦¬ë ì²´ì¸ì ë¤ì ë§í¬ê¹ì§ ê³ìë©ëë¤. ë°ë¼ì ì²´ì¸ì ë§ì§ë§ .catch()
ê¹ì§ 모ë ê±°ë¶ ì½ë°± í¨ì를 ìì íê² ìëµí ì ììµëë¤.
ê° .then()
ìì ê±°ë¶ë íë¡ë¯¸ì¤ë¥¼ ì²ë¦¬íë©´ íë¡ë¯¸ì¤ ì²´ì¸ì ë ìë쪽ì ìí¥ì 미칩ëë¤. ì¤ë¥ë¥¼ ì¦ì ì²ë¦¬í´ì¼ í기 ë문ì ì íì ì¬ì§ê° ìë ê²½ì°ë ììµëë¤. ì´ë¬í ê²½ì° ì²´ì¸ìì ì¤ë¥ ìí를 ì ì§í기 ìí´ ì´ë¤ ì íì ì¤ë¥ë¥¼ ë°ììì¼ì¼ í©ëë¤. ë°ë©´ì ì¦ê°ì ì¸ íìì±ì´ ìë ê²½ì°ìë ë§ì§ë§ .catch()
문ê¹ì§ ì¤ë¥ ì²ë¦¬ë¥¼ ìëµíë ê²ì´ ë ê°ë¨í©ëë¤. .catch()
ë ì¤ì ë¡ë ì½ìì´ ì´íë ê²½ì°ì ëí ì½ë°± í¨ì를 ìí ì¬ë¡¯ì´ ìë .then()
ì ë¶ê³¼í©ëë¤.
myPromise
.then(handleFulfilledA)
.then(handleFulfilledB)
.then(handleFulfilledC)
.catch(handleRejectedAny);
ì½ë°± í¨ìì íì´í í¨ì를 ì¬ì©íë©´ íë¡ë¯¸ì¤ ì²´ì¸ì 구íì ë¤ìê³¼ ê°ìµëë¤.
myPromise
.then((value) => `${value} and bar`)
.then((value) => `${value} and bar again`)
.then((value) => `${value} and again`)
.then((value) => `${value} and again`)
.then((value) => {
console.log(value);
})
.catch((err) => {
console.error(err);
});
ì°¸ê³ : ì¤í ìë를 ëì´ë ¤ë©´ 모ë ë기 ìì ì íëì í¸ë¤ë¬ ë´ìì ìííë ê²ì´ ë°ëì§íë©°, ê·¸ë ì§ ìì¼ë©´ 모ë í¸ë¤ë¬ë¥¼ ìì°¨ì ì¼ë¡ ì¤ííë ë° ëª í±ì´ 걸립ëë¤.
íë¡ë¯¸ì¤ì ì¢
ë£ ì¡°ê±´ì ë°ë¼ ì²´ì¸ìì ë¤ì íë¡ë¯¸ì¤ì "settled" ìíê° ê²°ì ë©ëë¤. "fulfilled" ìíë íë¡ë¯¸ì¤ê° ì±ê³µì ì¼ë¡ ìë£ëììì ëíë´ë©°, "rejected" ìíë ì±ê³µíì§ ëª»íìì ëíë
ëë¤. ì²´ì¸ìì ì´íë ê° íë¡ë¯¸ì¤ì ë°í ê°ì ë¤ì .then()
ì¼ë¡ ì ë¬ëê³ , ê±°ë¶ ì¬ì ë ì²´ì¸ì ë¤ì ê±°ì í¸ë¤ë¬ í¨ìë¡ ì ë¬ë©ëë¤.
ì²´ì¸ì ì½ìì ìë¡ ì¤ì²©ëì´ ìì§ë§ ì¤íì 맨 ê¼ë기ì²ë¼ íì´ëìµëë¤. ì²´ì¸ì 첫 ë²ì§¸ íë¡ë¯¸ì¤ë ê°ì¥ ê¹ê² ì¤ì²©ëì´ ìì¼ë©° ê°ì¥ 먼ì ëì¤ê² ë©ëë¤.
(promise D, (promise C, (promise B, (promise A) ) ) )
nextValue
ì´ íë¡ë¯¸ì¤ì¸ ê²½ì°, ê·¸ ê²°ê³¼ë ëì ì¼ë¡ ëì²´ë©ëë¤. return
ì íë¡ë¯¸ì¤ë¥¼ ë¹ ì ¸ëê°ê² íì§ë§ nextValue
íë¡ë¯¸ì¤ë ê·¸ ì리ì ë°ì´ë£ê² ë©ëë¤. ìì íìë ì¤ì²©ìì "promise B"ì ê´ë ¨ë .then()
ì´ "promise X"ì nextValue
를 ë°ííë ê²½ì°, ê²°ê³¼ ì¤ì²© 구조ë ë¤ìê³¼ ê°ì´ ë³´ì¼ ê²ì
ëë¤.
(promise D, (promise C, (promise X) ) )
íëì íë¡ë¯¸ì¤ë ë ì´ìì ì¤ì²©ì ì°¸ì¬í ì ììµëë¤. ë¤ì ì½ëì ê²½ì°, promiseA
를 "settled" ìíë¡ ì ííë©´ .then()
ì ë ì¸ì¤í´ì¤ê° 모ë í¸ì¶ë©ëë¤.
const promiseA = new Promise(myExecutorFunc);
const promiseB = promiseA.then(handleFulfilled1, handleRejected1);
const promiseC = promiseA.then(handleFulfilled2, handleRejected2);
ì´ë¯¸ "settled"ë íë¡ë¯¸ì¤ì ëìì í ë¹í ì ììµëë¤. ì´ ê²½ì°, í´ë¹ ëìì´ ì ì íë¤ë©´ 첫 ë²ì§¸ ë¹ë기 기íì ìíë©ëë¤. íë¡ë¯¸ì¤ë ë¹ë기ì ì¼ë¡ ì¤íëë ê²ì´ ë³´ì¥ëë¯ë¡, ì´ë¯¸ "settled"ë íë¡ë¯¸ì¤ì ëí ëìì ì¤íì´ í´ì ëê³ ìê°ì´ 경과í íìë§ ë°ìí©ëë¤. ì´ í¨ê³¼ë setTimeout(action, 0)ì ì ì¬í©ëë¤.
const promiseA = new Promise((resolve, reject) => {
resolve(777);
});
// At this point, "promiseA" is already settled.
promiseA.then((val) => console.log("asynchronous logging has val:", val));
console.log("immediate logging");
// ì´ ììë¡ ì¶ë ¥ì ìì±í©ëë¤.
// immediate logging
// asynchronous logging has val: 777
Thenables
JavaScript ìíê³ë íë¡ë¯¸ì¤ê° ì¸ì´ì ì¼ë¶ê° ë기 í¨ì¬ ì ë¶í° ì¬ë¬ ê°ì§ íë¡ë¯¸ì¤ 구íì ë§ë¤ì´ììµëë¤. ë´ë¶ì ì¼ë¡ ë¤ë¥´ê² ííë기ë íì§ë§, ìµìí 모ë íë¡ë¯¸ì¤ì ì ì¬í ê°ì²´ë Thenable ì¸í°íì´ì¤ë¥¼ 구íí©ëë¤. thenableì ë ê°ì ì½ë°±(íëë íë¡ë¯¸ì¤ê° ì´íë ë, ë¤ë¥¸ íëë ê±°ë¶ë ë)ê³¼ í¨ê» í¸ì¶ëë .then()
ë©ìë를 구íí©ëë¤. íë¡ë¯¸ì¤ ëí thenableì
ëë¤.
기존 íë¡ë¯¸ì¤ 구íê³¼ ìí¸ ì´ì©í기 ìí´ ì¸ì´ììë íë¡ë¯¸ì¤ ëì thenablesì ì¬ì©í ì ììµëë¤. ì를 ë¤ì´ Promise.resolve
ë íë¡ë¯¸ì¤ë¥¼ í´ê²°í ë¿ë§ ìëë¼ thenablesë ì¶ì í©ëë¤.
const aThenable = {
then(onFulfilled, onRejected) {
onFulfilled({
// thenableì ë¤ë¥¸ thenableë¡ ì±ìì§ëë¤.
then(onFulfilled, onRejected) {
onFulfilled(42);
},
});
},
};
Promise.resolve(aThenable); // íë¡ë¯¸ì¤ë 42ë¡ ì±ìì§ëë¤.
íë¡ë¯¸ì¤ ëìì±
Promise
í´ëì¤ë ë¹ë기 ìì
ëìì±ì ì©ì´íê² í기 ìí´ ë¤ ê°ì§ ì ì ë©ìë를 ì ê³µí©ëë¤.
Promise.all()
모ë íë¡ë¯¸ì¤ê° ì´íëë©´ ì´íëê³ , íë¡ë¯¸ì¤ ì¤ íëë¼ë ê±°ë¶ëë©´ ê±°ë¶ë©ëë¤.
Promise.allSettled()
모ë íë¡ë¯¸ì¤ê° í´ê²°ëë©´ ì´íë©ëë¤.
Promise.any()
íë¡ë¯¸ì¤ ì¤ íëë¼ë ì´íëë©´ ì´ííê³ , 모ë íë¡ë¯¸ì¤ê° ê±°ë¶ëë©´ ê±°ë¶í©ëë¤.
Promise.race()
íë¡ë¯¸ì¤ ì¤ íëë¼ë í´ê²°ëë©´ í´ê²°ë©ëë¤. ì¦, íë¡ë¯¸ì¤ ì¤ íëë¼ë ì´íëë©´ ì´íëê³ , ì½ì ì¤ íëë¼ë ê±°ë¶ëë©´ ê±°ë¶ë©ëë¤.
ì´ ëª¨ë ë©ìëë íë¡ë¯¸ì¤ì iterable(ì íí ë§íë©´, (thenables)ì ì·¨íê³ ìë¡ì´ íë¡ë¯¸ì¤ë¥¼ ë°íí©ëë¤. ì´ ë©ìëë¤ì 모ë ìë¸í´ëì±ì ì§ìíë¯ë¡ Promise
ì ìë¸í´ëì¤ìì í¸ì¶í ì ìì¼ë©°, ê·¸ ê²°ê³¼ë ìë¸í´ëì¤ ì íì íë¡ë¯¸ì¤ê° ë©ëë¤. ì´ë ê² íë ¤ë©´ ìë¸í´ëì¤ì ìì±ìê° Promise()
ìì±ìì ëì¼í ìê·¸ëì²ë¥¼ 구íí´ì¼ íë©°, resolve
ë° reject
ì½ë°±ì 매ê°ë³ìë¡ ì¬ì©íì¬ í¸ì¶í ì ìë executor
í¨ì를 ìë½í´ì¼ í©ëë¤. ëí ìë¸í´ëì¤ìë ê°ì íë¡ë¯¸ì¤ë¡ í´ê²°í기 ìí´ Promise.resolve()
ì²ë¼ í¸ì¶í ì ìë resolve
ì ì ë©ìëê° ìì´ì¼ í©ëë¤.
JavaScriptë 본ì§ì ì¼ë¡ single-threadedì´ë¯ë¡ í¹ì ìê°ìë íëì ìì ë§ ì¤íëì§ë§, ì ì´ê¶ì´ ë¤ë¥¸ íë¡ë¯¸ì¤ ê°ì ì´ëíì¬ íë¡ë¯¸ì¤ê° ëìì ì¤íëë ê²ì²ë¼ ë³´ì´ê² í ì ìë¤ë ì ì ì ìíì¸ì. JavaScriptìì ë³ë ¬ ì¤íì worker threads를 íµí´ìë§ ê°ë¥í©ëë¤.
ìì±ìPromise()
ìë¡ì´ Promise
ê°ì²´ë¥¼ ìì±í©ëë¤. ì£¼ë¡ íë¡ë¯¸ì¤ë¥¼ ì§ìíì§ ìë í¨ì를 ê°ì ë ì¬ì©í©ëë¤.
Promise[@@species]
íë¡ë¯¸ì¤ ë©ìëìì ë°íê°ì 구ì±íë ë° ì¬ì©ëë ìì±ì를 ë°íí©ëë¤.
Promise.all(iterable)
주ì´ì§ 모ë íë¡ë¯¸ì¤ê° ì´ííê±°ë, í íë¡ë¯¸ì¤ê° ê±°ë¶ë ëê¹ì§ ë기íë ìë¡ì´ íë¡ë¯¸ì¤ë¥¼ ë°íí©ëë¤.
ë°ííë íë¡ë¯¸ì¤ê° ì´ííë¤ë©´, 매ê°ë³ìë¡ ì ê³µí íë¡ë¯¸ì¤ ê°ê°ì ì´í ê°ì 모ë 모ìëì ë°°ì´ë¡ ì´íí©ëë¤. ë°°ì´ ììì ììë 매ê°ë³ìì ì§ì í íë¡ë¯¸ì¤ì ìì를 ì ì§í©ëë¤.
ë°ííë íë¡ë¯¸ì¤ê° ê±°ë¶ëë¤ë©´, 매ê°ë³ìì íë¡ë¯¸ì¤ ì¤ ê±°ë¶ë 첫 íë¡ë¯¸ì¤ì ì¬ì 를 ê·¸ëë¡ ì¬ì©í©ëë¤.
Promise.allSettled(iterable)
주ì´ì§ 모ë íë¡ë¯¸ì¤ê° ì²ë¦¬(ì´í ëë ê±°ë¶)ë ëê¹ì§ ë기íë ìë¡ì´ íë¡ë¯¸ì¤ë¥¼ ë°íí©ëë¤.
Promise.allSettled()
ê° ë°ííë íë¡ë¯¸ì¤ë 매ê°ë³ìë¡ ì ê³µí 모ë íë¡ë¯¸ì¤ ê°ê°ì ìíì ê°(ëë ê±°ë¶ ì¬ì )ì 모ìëì ë°°ì´ë¡ ì´íí©ëë¤.
Promise.any(iterable)
주ì´ì§ 모ë íë¡ë¯¸ì¤ ì¤ íëë¼ë ì´ííë ìê°, ì¦ì ê·¸ íë¡ë¯¸ì¤ì ê°ì¼ë¡ ì´ííë ìë¡ì´ íë¡ë¯¸ì¤ë¥¼ ë°íí©ëë¤.
Promise.race(iterable)
주ì´ì§ 모ë íë¡ë¯¸ì¤ ì¤ íëë¼ë ì²ë¦¬ë ëê¹ì§ ë기íë íë¡ë¯¸ì¤ë¥¼ ë°íí©ëë¤.
ë°ííë íë¡ë¯¸ì¤ê° ì´ííë¤ë©´, 매ê°ë³ìì íë¡ë¯¸ì¤ ì¤ ì²« ë²ì§¸ë¡ ì´íí íë¡ë¯¸ì¤ì ê°ì¼ë¡ ì´íí©ëë¤.
ë°ííë íë¡ë¯¸ì¤ê° ê±°ë¶ëë¤ë©´, 매ê°ë³ìì íë¡ë¯¸ì¤ ì¤ ê±°ë¶ë 첫 íë¡ë¯¸ì¤ì ì¬ì 를 ê·¸ëë¡ ì¬ì©í©ëë¤.
Promise.reject(reason)
주ì´ì§ ì¬ì ë¡ ê±°ë¶íë Promise
ê°ì²´ë¥¼ ë°íí©ëë¤.
Promise.resolve()
주ì´ì§ ê°ì¼ë¡ ì´ííë Promise
ê°ì²´ë¥¼ ë°íí©ëë¤. ì´ë ì§ì í ê°ì´ then
ê°ë¥í(then
ë©ìë를 ê°ì§ë) ê°ì¸ ê²½ì°, Promise.resolve()
ê° ë°ííë íë¡ë¯¸ì¤ë then
ë©ìë를 "ë°ë¼ê°ì" ìì ì ìµì¢
ìí를 ê²°ì í©ëë¤. ê·¸ ì¸ì ê²½ì°, ë°íë íë¡ë¯¸ì¤ë 주ì´ì§ ê°ì¼ë¡ ì´íí©ëë¤.
ì´ë¤ ê°ì´ íë¡ë¯¸ì¤ì¸ì§ ìëì§ ì ì ìë ê²½ì°, ë³´íµ ì¼ì¼ì´ ë ê²½ì°ë¥¼ ëë ì ì²ë¦¬íë ëì Promise.resolve()
ë¡ ê°ì ê°ì¸ì íì íë¡ë¯¸ì¤ê° ëëë¡ ë§ë í ìì
íë ê²ì´ ì¢ìµëë¤.
ì´ë¬í ìì±ì Promise.prototype
ì ì ìëë©° 모ë Promise
ì¸ì¤í´ì¤ìì ê³µì ë©ëë¤.
Promise.prototype.constructor
ì¸ì¤í´ì¤ ê°ì²´ë¥¼ ìì±í ìì±ì í¨ìì
ëë¤. Promise
ì¸ì¤í´ì¤ì ê²½ì° ì´ê¸°ê°ì Promise
ìì±ìì
ëë¤.
Promise.prototype[@@toStringTag]
@@toStringTag
ìì±ì ì´ê¸° ê°ì 문ìì´ "Promise"
ì
ëë¤. ì´ ìì±ì Object.prototype.toString()
ìì ì¬ì©ë©ëë¤.
Promise.prototype.catch()
Promise.prototype.finally()
Promise.prototype.then()
onFulfilled
, onRejected
ì¤ ìíì ë§ë ì½ë°±ì´ í¨ìê° ìë ê²½ì°) ì²ë¦¬ë ê°ê³¼ ìí ê·¸ëë¡ ì²ë¦¬ëë ìë¡ì´ íë¡ë¯¸ì¤ë¥¼ ë°íí©ëë¤.let myFirstPromise = new Promise((resolve, reject) => {
// ì°ë¦¬ê° ìíí ë¹ë기 ìì
ì´ ì±ê³µí ê²½ì° resolve(...)를 í¸ì¶íê³ , ì¤í¨í ê²½ì° reject(...)를 í¸ì¶í©ëë¤.
// ì´ ìì ììë setTimeout()ì ì¬ì©í´ ë¹ë기 ì½ë를 íë´ë
ëë¤.
// ì¤ì ë¡ë ì¬ê¸°ì XHRì´ë HTML5 API를 ì¬ì©í ê²ì
ëë¤.
setTimeout(function () {
resolve("ì±ê³µ!"); // ì! 문ì ìì!
}, 250);
});
myFirstPromise.then((successMessage) => {
// successMessageë ììì resolve(...) í¸ì¶ì ì ê³µí ê°ì
ëë¤.
// 문ìì´ì´ì´ì¼ íë ë²ì ìì§ë§, ììì 문ìì´ì 줬ì¼ë ìë§ ë¬¸ìì´ì¼ ê²ì
ëë¤.
console.log("ì! " + successMessage);
});
ë¤ìí ìí©ì ìì
// ì¤ë¥ ì²ë¦¬ë¥¼ ì¤íí기 ìí´ 'threshold' ê°ì 무ììë¡ ì¤ë¥ë¥¼ ë°ììíµëë¤.
const THRESHOLD_A = 8; // 0ì ì¬ì©íì¬ ì¤ë¥ë¥¼ ë³´ì¥í ì ììµëë¤.
function tetheredGetNumber(resolve, reject) {
setTimeout(() => {
const randomInt = Date.now();
const value = randomInt % 10;
if (value < THRESHOLD_A) {
resolve(value);
} else {
reject(`Too large: ${value}`);
}
}, 500);
}
function determineParity(value) {
const isOdd = value % 2 === 1;
return { value, isOdd };
}
function troubleWithGetNumber(reason) {
const err = new Error("Trouble getting number", { cause: reason });
console.error(err);
throw err;
}
function promiseGetWord(parityInfo) {
return new Promise((resolve, reject) => {
const { value, isOdd } = parityInfo;
if (value >= THRESHOLD_A - 1) {
reject(`Still too large: ${value}`);
} else {
parityInfo.wordEvenOdd = isOdd ? "odd" : "even";
resolve(parityInfo);
}
});
}
new Promise(tetheredGetNumber)
.then(determineParity, troubleWithGetNumber)
.then(promiseGetWord)
.then((info) => {
console.log(`Got: ${info.value}, ${info.wordEvenOdd}`);
return info;
})
.catch((reason) => {
if (reason.cause) {
console.error("Had previously handled error");
} else {
console.error(`Trouble with promiseGetWord(): ${reason}`);
}
})
.finally((info) => console.log("All done"));
ê³ ê¸ ìì
ë¤ìì ìì ìì ë Promise
ì ëì ë°©ìì ë³´ì¬ì¤ëë¤. testPromise()
í¨ìë <button>
ì í´ë¦í ëë§ë¤ í¸ì¶ëë©°, window.setTimeout()
ì ì¬ì©í´ 1~3ì´ì 무ìì ê°ê²© ì´í íë¡ë¯¸ì¤ íì(1ë¶í° ììíë ì«ì)ë¡ ì´ííë íë¡ë¯¸ì¤ë¥¼ ìì±í©ëë¤. Promise()
ìì±ìë íë¡ë¯¸ì¤ë¥¼ ë§ëë ë° ì°ì
ëë¤.
íë¡ë¯¸ì¤ ì´íì p1.then()
ì ì¬ì©íë ì´í ì½ë°± ì¸í¸ë¥¼ íµí´ ë¨ìí ë¡ê·¸ì ë¨ìµëë¤. ì½ê°ì ë¡ê·¸ë¥¼ íµí´, í¨ìì ë기 ë¶ë¶ì´ ë¹ë기ì íë¡ë¯¸ì¤ì ìë£ì ì´ë»ê² ë¶ë¦¬ëì´ ìëì§ íì¸í ì ììµëë¤.
ì§§ì ìê° ëì ë²í¼ì ì¬ë¬ ë² í´ë¦íë©´ ë¤ë¥¸ íë¡ë¯¸ì¤ê° ì°¨ë¡ë¡ ì´íëë ê²ì ë³¼ ìë ììµëë¤.
HTML<button id="btn">íë¡ë¯¸ì¤ ë§ë¤ê¸°!</button>
<div id="log"></div>
JavaScript
"use strict";
var promiseCount = 0;
function testPromise() {
var thisPromiseCount = ++promiseCount;
var log = document.getElementById("log");
log.insertAdjacentHTML(
"beforeend",
thisPromiseCount + ") ìì (<small>ë기ì ì½ë ìì</small>)<br/>",
);
// ì íë¡ë¯¸ì¤ ìì± - íë¡ë¯¸ì¤ì ìì± ìì를 ì ë¬íê² ë¤ë ì½ìì í¨ (3ì´ ê¸°ë¤ë¦° í)
var p1 = new Promise(
// ì¤í í¨ìë íë¡ë¯¸ì¤ë¥¼ ì´í(resolve)íê±°ë
// ê±°ë¶(reject)í ì ìì
function (resolve, reject) {
log.insertAdjacentHTML(
"beforeend",
thisPromiseCount +
") íë¡ë¯¸ì¤ ìì (<small>ë¹ë기ì ì½ë ìì</small>)<br/>",
);
// setTimeoutì ë¹ë기ì ì½ë를 ë§ëë ìì ì ë¶ê³¼
window.setTimeout(
function () {
// íë¡ë¯¸ì¤ ì´í !
resolve(thisPromiseCount);
},
Math.random() * 2000 + 1000,
);
},
);
// íë¡ë¯¸ì¤ë¥¼ ì´ííì ë í ì¼ì then() í¸ì¶ë¡ ì ìíê³ ,
// ê±°ë¶ëì ë í ì¼ì catch() í¸ì¶ë¡ ì ì
p1.then(
// ì´í ê° ê¸°ë¡
function (val) {
log.insertAdjacentHTML(
"beforeend",
val + ") íë¡ë¯¸ì¤ ì´í (<small>ë¹ë기ì ì½ë ì¢
ë£</small>)<br/>",
);
},
).catch(
// ê±°ë¶ ì´ì 기ë¡
function (reason) {
console.log("ì¬ê¸°ì ê±°ë¶ë íë¡ë¯¸ì¤(" + reason + ")를 ì²ë¦¬íì¸ì.");
},
);
log.insertAdjacentHTML(
"beforeend",
thisPromiseCount + ") íë¡ë¯¸ì¤ ìì± (<small>ë기ì ì½ë ì¢
ë£</small>)<br/>",
);
}
if ("Promise" in window) {
var btn = document.getElementById("btn");
btn.addEventListener("click", testPromise);
} else {
log = document.getElementById("log");
log.innerHTML =
"Live example not available as your browser doesn't support the <code>Promise<code> interface.";
}
ê²°ê³¼ XHRë¡ ì´ë¯¸ì§ ë¶ë¬ì¤ê¸°
ì´ë¯¸ì§ë¥¼ ë¡ëí기 ìí´ Promise
ë° XMLHttpRequest
를 ì¬ì©íë ë ë¤ë¥¸ ê°ë¨í ìë MDN GitHub js-examples ì ì¥ììì ì´ì©í ì ììµëë¤. ì¤ì ì를 ë³¼ ìë ììµëë¤. ê° ë¨ê³ì 주ìì´ ë¶ì´ìì´, íë¡ë¯¸ì¤ ë° XHR 구조를 차근차근 ë°ë¼ê° ì ììµëë¤.
ì¤ì ê°ì²´ë JavaScript ì½ëê° ì¤íë ë ì¶ê° ì 보를 ì ê³µíë íê²½ì ëë¤. ì¬ê¸°ìë realm ë° ëª¨ë ë§µì ë¬¼ë¡ ì¶ì²ì ê°ì HTML í¹ì ì ë³´ê° í¬í¨ë©ëë¤. ë¸ë¼ì°ì ê° í¹ì ì¬ì©ì ì½ëì ì´ë¤ ì¤ì ê°ì²´ë¥¼ ì¬ì©í ì§ ì ì ìëë¡ íì¬ ì¤ì ê°ì²´ë¥¼ ì¶ì í©ëë¤.
ì´ë¥¼ ë ì ì´í´í기 ìí´ realmì´ ì´ë»ê² 문ì ê° ë ì ìëì§ ìì¸í ì´í´ë³¼ ì ììµëë¤. realmì ëëµ ì ì ê°ì²´ë¡ ìê°í ì ììµëë¤. realmì ë
í¹í ì ì JavaScript ì½ë를 ì¤ííë ë° íìí 모ë ì 보를 ë´ê³ ìë¤ë ê²ì
ëë¤. ì¬ê¸°ìë array
ë° error
ì ê°ì ê°ì²´ê° í¬í¨ë©ëë¤. ê° ì¤ì ê°ì²´ìë ì´ë¬í ê°ì²´ì ê³ ì í "ë³µì¬ë³¸"ì´ ìì¼ë©° ê³µì ëì§ ììµëë¤. ì´ë¡ ì¸í´ íë¡ë¯¸ì¤ì ê´ë ¨íì¬ ìê¸°ì¹ ìì ëìì´ ë°ìí ì ììµëë¤. ì´ ë¬¸ì 를 í´ê²°í기 ìí´ ê¸°ì¡´ ì¤ì ê°ì²´ë¼ë ê²ì ì¶ì í©ëë¤. ì´ë í¹ì í¨ì í¸ì¶ì ë´ë¹íë ì¬ì©ì ì½ëì ë´ì©ê³¼ ê´ë ¨ë ì 보를 ëíë
ëë¤.
ì´ë¥¼ ì¢ ë ì¤ëª
í기 ìí´ ë¬¸ìì ì½ì
ë <iframe>
ì´ í¸ì¤í¸ì íµì íë ë°©ìì ì´í´ë³¼ ì ììµëë¤. 모ë ì¹ APIë íì¬ ì¤ì ê°ì²´ë¥¼ ì¸ìíë¯ë¡ ë¤ìì 모ë ë¸ë¼ì°ì ìì ìëí©ëë¤.
<!doctype html> <iframe></iframe>
<!-- ì´ ë¶ë¶ì realmì´ ììµëë¤. -->
<script>
// ì´ ë¶ë¶ìë realmì´ ììµëë¤.
const bound = frames[0].postMessage.bind(frames[0], "some data", "*");
// ë°ì¸ë©ì ë´ì¥ í¨ìì´ë©° ì¬ì©ìê° ììµëë¤.
// ì¤íì ì½ëì´ë©°, ì´ë¤ realmì ì¬ì©í´ì¼ í ê¹ì?
setTimeout(bound);
// ê°ì¥ ìµì ì ì¬ì©í기 ë문ì ì¬ì í ìëí©ëë¤.
// realm(기존)ì ì¤íì ì¶ê°í©ëë¤.
</script>
íë¡ë¯¸ì¤ìë ëì¼í ê°ë ì´ ì ì©ë©ëë¤. ìì ìì 를 ì¡°ê¸ ìì íë©´ ë¤ìê³¼ ê°ì´ ë©ëë¤.
<!doctype html> <iframe></iframe>
<!-- ì´ ë¶ë¶ì realmì´ ììµëë¤. -->
<script>
// ì´ ë¶ë¶ìë realmì´ ììµëë¤.
const bound = frames[0].postMessage.bind(frames[0], "some data", "*");
// ë°ì¸ë©ì ë´ì¥ í¨ìì´ë©° ì¬ì©ìê° ììµëë¤.
// ì¤íì ì½ëì´ë©°, ì´ë¤ realmì ì¬ì©í´ì¼ í ê¹ì?
Promise.resolve(undefined).then(bound);
// ê°ì¥ ìµì ì ì¬ì©í기 ë문ì ì¬ì í ìëí©ëë¤.
// realm(기존)ì ì¤íì ì¶ê°í©ëë¤.
</script>
문ìì <iframe>
ì´ ê²ì물 ë©ìì§ë¥¼ ìì íëë¡ ë³ê²½íë©´ 기존 ì¤ì ê°ì²´ì í¨ê³¼ë¥¼ ê´ì°°í ì ììµëë¤.
<!-- y.html -->
<!doctype html>
<iframe src="x.html"></iframe>
<script>
const bound = frames[0].postMessage.bind(frames[0], "some data", "*");
Promise.resolve(undefined).then(bound);
</script>
<!-- x.html -->
<!doctype html>
<script>
window.addEventListener(
"message",
(event) => {
document.querySelector("#text").textContent = "hello";
// this code will only run in browsers that track the incumbent settings object
console.log(event);
},
false,
);
</script>
ì ìì ììë íì¬ ì¤ì ê°ì²´ë¥¼ ì¶ì íë ê²½ì°ìë§ <iframe>
ì ë´ë¶ í
ì¤í¸ê° ì
ë°ì´í¸ë©ëë¤. ì´ë íì¬ ìí를 ì¶ì íì§ ìì¼ë©´ ì못ë íê²½ì ì¬ì©íì¬ ë©ìì§ë¥¼ ì ì¡í ì ì기 ë문ì
ëë¤.
ì°¸ê³ : íì¬ realm ì¶ì ì Firefoxìì ìì í 구íëì´ ìì¼ë©°, Chromeê³¼ Safariììë ë¶ë¶ì ì¼ë¡ 구íëì´ ììµëë¤.
ëª ì¸ì ë¸ë¼ì°ì í¸íì± ê°ì´ 보기RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4