Baseline Widely available *
Promise
ãªãã¸ã§ã¯ãã¯ãéåæå¦çã®å®äºï¼ãããã¯å¤±æï¼ã®çµæããã³ãã®çµæã®å¤ã表ãã¾ãã
ãããã¹ã®æåã¨ä½¿ç¨æ³ã«ã¤ãã¦å¦ã¶ã«ã¯ãæåã«ãããã¹ã®ä½¿ç¨ããèªã¿ãã ããã
解説ãããã¹ (Promise
) ã¯ã使ãããæç¹ã§ã¯åãããªãã¦ãããå¤ã¸ã®ãããã·ã¼ã§ããéåæã®ã¢ã¯ã·ã§ã³ã®æåå¤ã¾ãã¯å¤±æçç±ã«ãã³ãã©ã¼ãçµã³ã¤ãããã¨ãã§ãã¾ããããã«ãããéåæã¡ã½ããã¯çµæã®å¤ãè¿ã代ããã«ãæªæ¥ã®ããæç¹ã§å¤ãæä¾ãããããã¹ãè¿ããã¨ã§ãåæã¡ã½ããã¨åãããã«å¤ãè¿ããã¨ãã§ããããã«ãªãã¾ãã
Promise
ã®ç¶æ
ã¯ä»¥ä¸ã®ããããã¨ãªãã¾ãã
å¾
æ©ç¶æ
ã®ãããã¹ã® æçµçãªç¶æ
ã¯ãä½ããã®å¤ãæã¤å±¥è¡ (fulfilled) ç¶æ
ããããã¯ä½ããã®çç± (ã¨ã©ã¼) ãæã¤æå¦ (rejected) ç¶æ
ã®ããããã«ãªãã¾ãã ãã®ã©ã¡ãã¨ãªã£ã¦ããthen
ã¡ã½ããã«ãã£ã¦é¢é£ä»ãããããã³ãã©ã¼ãå¼ã³åºããã¾ãã対å¿ãããã³ãã©ã¼ãå²ãå½ã¦ãããã¨ããæ¢ã«ãããã¹ãå±¥è¡ã¾ãã¯æå¦ç¶æ
ã«ãªã£ã¦ãã¦ãããã®ãã³ãã©ã¼ã¯å¼ã³åºããã¾ãããã£ã¦ãéåæå¦çã¨ãã®é¢é£ä»ãããããã³ãã©ã¼ã¨ã®ç«¶åã¯çºçãã¾ããã
ãããã¹ãå±¥è¡ã¾ãã¯æå¦ã®ããããã§ãå¾ æ©ä»¥å¤ã®ç¶æ ã«ãªã£ãå ´åã¯ãæ±ºå® (settled) ã¨å¼ã°ãã¾ãã
ã¾ãããããã¹ã§ã¯è§£æ±º (resolved) ã¨ããç¨èªã使ç¨ããããã¨ãããã¾ããããã¯ããããã¹ãä»ã®ãããã¹ã®æçµçãªç¶æ ã¨ä¸è´ããããã«æ±ºå®ã¾ãã¯ãããã¯ã¤ã³ããããããã«è§£æ±ºã¾ãã¯æå¦ãã¦ãä½ã®å½±é¿ããªããã¨ãæå³ãã¾ããå ã®ãããã¹ã®ææ¡ã® States and fates ã®è¨äºã«ã¯ããããã¹ã®ç¨èªã«ã¤ãã¦ã®ãã詳細ãªèª¬æãããã¾ããå£èªçã«ã¯ãã解決ãããããããã¹ã¯ãå±¥è¡ãããããããã¹ã¨ããåçã«æ±ããã¾ããã "States and fates" ã§ç¤ºãã¦ããããã«ã解決ããããããã¹ã¯å¾ æ©ç¶æ ã«ãªã£ããæå¦ãããããããã¨ãããã¾ããæ¬¡ã®ä¾ãåç §ãã¦ãã ããã
new Promise((resolveOuter) => {
resolveOuter(
new Promise((resolveInner) => {
setTimeout(resolveInner, 1000);
}),
);
});
ãã®ãããã¹ã¯ä½æãããæç¹ã§ãã§ã« 解決 ããã¦ãã¾ããï¼resolveOuter
ãåæçã«å¼ã³åºãããããï¼ãå¥ã®ãããã¹ã§è§£æ±ºããã¦ããããã 1 ç§å¾ã«å
å´ã®ãããã¹ãå±¥è¡ãããã¾ã§ å±¥è¡ ããã¾ãããå®éã«ã¯ãã解決ãã¯èå°è£ã§è¡ããã観å¯ãããã¨ãã§ãããå±¥è¡ãæå¦ãã ãã観å¯ãããã¨ãã§ãã¾ãã
ã¡ã¢: Scheme ãªã©ä¸é¨ã®è¨èªã§ã¯ãé
å»¶è©ä¾¡ãè¨ç®ãå»¶æããæ©æ§ãæã£ã¦ãããããããããããã¹ãã¨å¼ã°ãã¾ãã JavaScript ã«ããããããã¹ã¯ããã§ã«èµ·ãã¤ã¤ããå¦çã表ãããã®å¦çã¯ã³ã¼ã«ããã¯é¢æ°ã使ããã¨ã§é£éããããã¨ãã§ãã¾ããå¼ãé
å»¶è©ä¾¡ããæ¹æ³ãæ¢ãã¦ããã®ã§ããã°ã弿°ãªãã®é¢æ°ã使ç¨ãããæ¤è¨ãã¦ãã ããã f = () => expression
ã§é
å»¶è©ä¾¡ãããå¼ã使ã§ãã f()
ã§ãã®å¼ãç´ã¡ã«è©ä¾¡ãããã¨ãã§ãã¾ãã
Promise
èªä½ã«ã¯ãã£ã³ã»ã«ç¨ã®ç¬¬ä¸ç´ãããã³ã«ã¯ããã¾ããããé常㯠AbortController
ã使ç¨ãã¦ããã®åºç¤ã¨ãªãéåææä½ãç´æ¥ãã£ã³ã»ã«ã§ããå ´åãããã¾ãã
then()
, catch()
, finally()
ã®åã¡ã½ããã使ç¨ãã¦ã決å®ãããããã¹ã«ãããªãã¢ã¯ã·ã§ã³ãçµã³ã¤ãããã¨ãã§ãã¾ããthen()
ã¡ã½ããã¯ãæå¤§ã§ 2 ã¤ã®å¼æ°ãåãã¾ãã1 çªç®ã®å¼æ°ã¯ããããã¹ãå±¥è¡ãããå ´åã®ã³ã¼ã«ããã¯é¢æ°ã§ã 2 çªç®ã®å¼æ°ã¯ãæå¦ãããå ´åã®ã³ã¼ã«ããã¯é¢æ°ã§ããcatch()
ã¡ã½ãã㨠finally()
ã¡ã½ããã¯å
é¨ã§ then()
ãå¼ã³åºããã¨ã©ã¼å¦çãç°¡æ½ã«ãã¾ããä¾ãã°ãcatch()
ã¯å±¥è¡ãã³ãã©ã¼ã渡ããªã then()
ã¡ã½ããã¨åãã§ãããããã®ã¡ã½ããã¯ãããã¹ãè¿ããããé£çµãããã¨ãã§ãã¾ããä¾ãã°æ¬¡ã®ããã«ãªãã¾ãã
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("foo");
}, 300);
});
myPromise
.then(handleFulfilledA, handleRejectedA)
.then(handleFulfilledB, handleRejectedB)
.then(handleFulfilledC, handleRejectedC);
ããã§ã¯ã次ã®ç¨èªã使ç¨ãã¾ãããåæãããã¹ãã¨ã¯ãthen
ãå¼ã³åºããããããã¹ã§ãããæ°ãããããã¹ãã¨ã¯ãthen
ãè¿ããããã¹ã§ããthen
ã«æ¸¡ã 2 ã¤ã®ã³ã¼ã«ããã¯ã¯ããããããå±¥è¡ãã³ãã©ã¼ãã¨ãæå¦ãã³ãã©ã¼ãã¨å¼ã³ã¾ãã
åæãããã¹ã®æ±ºå®ç¶æ ã«ãã£ã¦ãå®è¡ãããã³ãã©ã¼ã決ã¾ãã¾ãã
ãã³ãã©ã¼ã®å®äºã«ãã£ã¦ãæ°ãããããã¹ã®æ±ºå®ç¶æ ãæ±ºã¾ãã¾ãã
ä¾ãã°ãä¸è¨ã®ã³ã¼ãã§ã¯ãmyPromise
ãæå¦ãããå ´åãhandleRejectedA
ãå¼ã³åºãããhandleRejectedA
ãæ£å¸¸ã«å®äºããå ´åï¼ã¨ã©ã¼ãçºçãããæå¦ããããããã¹ãè¿ãããããªãéãï¼ãæåã® then
ã§è¿ããããããã¹ã¯æå¦ãããã¾ã¾ã«ãªãã®ã§ã¯ãªããå±¥è¡ããã¾ãããããã£ã¦ãã¨ã©ã¼ãããã«å¦çããå¿
è¦ããããã®ã®ããã®å¾ã®å¦çã§ã¨ã©ã¼ç¶æ
ãç¶æãããå ´åã¯ãæå¦ãã³ãã©ã¼ã§ä½ããã®åã®ã¨ã©ã¼ãçºçãããå¿
è¦ãããã¾ãã䏿¹ãå³åº§ã«ã¨ã©ã¼å¦çãããå¿
è¦ããªãå ´åã¯ãæçµç㪠catch()
ãã³ãã©ã¼ã¾ã§ã¨ã©ã¼å¦çãçç¥ããæ¹ãç°¡åã§ãã
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);
});
ã¡ã¢: ããé«éã«å®è¡ããããã«ã¯ãã§ããã°ãã¹ã¦ã®åæã¢ã¯ã·ã§ã³ã 1 ã¤ã®ãã³ãã©ã¼å ã§è¡ãããã«ãã¦ãã ãããããããªããã°ããã¹ã¦ã®ãã³ãã©ã¼ãé çªã«å®è¡ããã®ã«æ°ã«ã¦ã³ãããããã¨ã«ãªãã¾ãã
JavaScript ã¯ã¸ã§ããã¥ã¼ãç¶æãã¾ãã JavaScript ã¯æ¯åããã¥ã¼ããã¸ã§ãã鏿ãããããå®å
¨ã«å®è¡ãã¾ãã ã¸ã§ãã¯ãPromise()
ã³ã³ã¹ãã©ã¯ã¿ã¼ã®å®è¡è
ãthen
ã«æ¸¡ããããã³ãã©ã¼ãã¾ãã¯ãããã¹ãè¿ããã©ãããã©ã¼ã API ã«ãã£ã¦å®ç¾©ããã¾ãã é£éãããããã¹ã¯ããããã®ã¸ã§ãéã®ä¾åé¢ä¿ã表ãã¾ãã ãããã¹ã確å®ããã¨ãããã«é¢é£ä»ããããåãã³ãã©ã¼ãã¸ã§ããã¥ã¼ã®æå¾ã«è¿½å ããã¾ãã
ãããã¹ã¯è¤æ°ã®é£éã«åå ã§ãã¾ããæ¬¡ã®ã³ã¼ãã«ããã¦ãpromiseA
ãå±¥è¡ãããã¨ãhandleFulfilled1
㨠handleFulfilled2
ã®ä¸¡æ¹ãã¸ã§ããã¥ã¼ã«è¿½å ããã¾ããhandleFulfilled1
ãæåã«ç»é²ããã¦ãããããæåã«å¼ã³åºããã¾ãã
const promiseA = new Promise(myExecutorFunc);
const promiseB = promiseA.then(handleFulfilled1, handleRejected1);
const promiseC = promiseA.then(handleFulfilled2, handleRejected2);
ãã§ã«æ±ºå®æ¸ã¿ã®ãããã¹ã«ã¢ã¯ã·ã§ã³ãå²ãå½ã¦ããã¨ãã§ãã¾ãããã®å ´åãã¢ã¯ã·ã§ã³ã¯ããã«ã¸ã§ããã¥ã¼ã®æå¾ã«è¿½å ãããæ¢åã®ã¸ã§ãããã¹ã¦å®äºããã¨å®è¡ããã¾ãããããã£ã¦ããã§ã«ãæ±ºå®æ¸ã¿ãã®ãããã¹ã«å¯¾ããã¢ã¯ã·ã§ã³ã¯ãç¾å¨ã®åæã³ã¼ããå®äºããå°ãªãã¨ã1ã¤ã®ã«ã¼ããã£ãã¯ã渡ãããå¾ã«ã®ã¿çºçãã¾ããããã«ããããããã¹ã¢ã¯ã·ã§ã³ãéåæã§ãããã¨ãä¿è¨¼ããã¾ãã
const promiseA = new Promise((resolve, reject) => {
resolve(777);
});
// ãã®æç¹ã§ã "promiseA" ã¯ãã§ã«æ±ºå®ããã¦ãã¾ãã
promiseA.then((val) => console.log("asynchronous logging has val:", val));
console.log("immediate logging");
// 以ä¸ã®é åºã§åºåãè¡ããã¾ãã
// immediate logging
// asynchronous logging has val: 777
Thenable
JavaScript ã®ã¨ã³ã·ã¹ãã ã«ã¯ããããã¹ãè¨èªã®ä¸é¨ã¨ãªããã£ã¨åãããè¤æ°ã®ãããã¹ã®å®è£
ãããã¾ãããå
é¨ã§ã¯æ§ã
ãªå½¢ã§è¡¨ç¾ããã¦ãã¾ãããæä½éããã¹ã¦ã®ãããã¹é¢¨ã®ãªãã¸ã§ã¯ã㯠Thenable ã¤ã³ã¿ã¼ãã§ã¤ã¹ãå®è£
ãã¦ãã¾ãã Thenable 㯠.then()
ã¡ã½ãããå®è£
ãã¦ãã¾ãããã㯠2 ã¤ã®ã³ã¼ã«ããã¯ãåãã1 ã¤ã¯ãããã¹ãå±¥è¡ãããã¨ãããã 1 ã¤ã¯ãããã¹ãæå¦ãããã¨ãã«å¼ã³åºããã¾ãããããã¹ã¯ Thenable ã§ãããã¾ãã
æ¢åã®ãããã¹å®è£
ã¨ç¸äºéç¨ããããã«ãè¨èªã§ã¯ãããã¹ã®ä»£ããã« Thenable ã使ç¨ãããã¨ãã§ãã¾ããä¾ãã°ã Promise.resolve
ã¯ãããã¹ã®è§£æ±ºã ãã§ãªãã Thenable ã®è¿½è·¡ãè¡ãã¾ãã
const aThenable = {
then(onFulfilled, onRejected) {
onFulfilled({
// Thenable ã¯ä»ã® Thenable ã§å±¥è¡ããã
then(onFulfilled, onRejected) {
onFulfilled(42);
},
});
},
};
Promise.resolve(aThenable); // ãããã¹ã¯ 42 ã§å±¥è¡
ãããã¹ã®ä¸¦è¡å¦ç
Promise
ã¯ã©ã¹ã¯ï¼éåæã¿ã¹ã¯ã®ä¸¦è¡å¦çã容æã«ããããã«ã4 ã¤ã®éçã¡ã½ãããæä¾ãã¦ãã¾ãã
Promise.all()
ãã¹ã¦ã®ãå±¥è¡ãããã¨ãã«å±¥è¡ãããããããã®ãããã¹ãæå¦ãããã¨æå¦ãããã
Promise.allSettled()
ãã¹ã¦ã®ãããã¹ã決å®ãããã¨ãã«å±¥è¡ãããã
Promise.any()
ããããã®ãããã¹ãå±¥è¡ãããã¨ãã«å±¥è¡ããããã¹ã¦ã®ãããã¹ãæå¦ãããã¨æå¦ãããã
Promise.race()
ããããã®ãããã¹ã決å®ãããã¨ãã«æ±ºå®ããã¾ããããªãã¡ãããããã®ãããã¹ãå±¥è¡ãããã°å±¥è¡ãããããããã®ãããã¹ãæå¦ãããã°æå¦ããã¾ãã
ãããã®ã¡ã½ããã¯ãã¹ã¦ããããã¹ï¼æ£ç¢ºã«ã¯ Thenableï¼ã®å復å¯è½ãªãã¸ã§ã¯ããåãåããæ°ãããããã¹ãè¿ãã¾ãããããã¯ãã¹ã¦ãµãã¯ã©ã¹åã«å¯¾å¿ãã¦ãã¾ããã¤ã¾ãã Promise
ã®ãµãã¯ã©ã¹ã«å¯¾ãã¦å¼ã³åºããã¨ãã§ãããã®çµæã¯ãµãã¯ã©ã¹ã®ç¨®é¡ãæã¤ãããã¹ã«ãªãã¾ãããã®ããã«ã¯ããµãã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã« Promise()
ã¨åãå®ç¾©ãå®è£
ããå¿
è¦ãããã¾ããããªãã¡ãåä¸ã® executor
颿°ãåããããã resolve
㨠reject
ã³ã¼ã«ããã¯é¢æ°ã弿°ã¨ãã¦åãããã«ãã¾ããã¾ãããµãã¯ã©ã¹ã«ã¯éçã¡ã½ããã® resolve
ãå¿
è¦ã§ãããã㯠Promise.resolve()
ã®ããã«å¼ã³åºããã¨ãã§ããå¤ããããã¹ã«è§£æ±ºããããã®ã¡ã½ããã§ãã
JavaScript ã¯ãã¨ãã¨ã·ã³ã°ã«ã¹ã¬ãããªã®ã§ãç°ãªããããã¹éã§å¶å¾¡ãç§»ãããããã¹ã®å®è¡ãåæã«è¡ãããããã«è¦ãã¦ããæå®ãããç¬éã«ã¯ 1 ã¤ã®ã¿ã¹ã¯ããå®è¡ãããªããã¨ã«æ³¨æãã¦ãã ãããJavaScript ã§ä¸¦åå®è¡ãè¡ãã«ã¯ãã¯ã¼ã«ã¼ã¹ã¬ããã使ãããããã¾ããã
ã³ã³ã¹ãã©ã¯ã¿ã¼Promise()
æ°ãã Promise
ãªãã¸ã§ã¯ããçæãã¾ãããã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ä¸»ã«ãã¾ã ãããã¹ã«å¯¾å¿ãã¦ããªã颿°ãã©ããããããã«ä½¿ããã¾ãã
Promise[Symbol.species]
ãããã¹ã®ã¡ã½ããããè¿å¤ãæ§ç¯ããããã«ä½¿ç¨ããã³ã³ã¹ãã©ã¯ã¿ã¼ãè¿ãã¾ãã
Promise.all()
å
¥åã¨ãã¦ãããã¹ã®å復å¯è½ãªãã¸ã§ã¯ããåãåããåä¸ã® Promise
ãè¿ãã¾ãããã®è¿ããããããã¹ã¯ãå
¥åããããããã¹ããã¹ã¦å±¥è¡ãããã¨ãï¼ç©ºã®å復å¯è½ãªãã¸ã§ã¯ããæ¸¡ãããã¨ããå«ããï¼ã«ãå±¥è¡ãããå¤ã®é
åã§å±¥è¡ããã¾ããå
¥åã®ãããã¹ã®ãããããæå¦ãããã¨ããã®æåã®æå¦çç±ã«ãã£ã¦æå¦ããã¾ãã
Promise.allSettled()
å
¥åã¨ãã¦ãããã¹ã®å復å¯è½ãªãã¸ã§ã¯ããåãåããåä¸ã® Promise
ãè¿ãã¾ãããã®è¿ããããããã¹ã¯ãå
¥åã®ãããã¹ããã¹ã¦æ±ºå®ãããã¨ãã«å±¥è¡ããã¾ãï¼ç©ºã®å復å¯è½ãªãã¸ã§ã¯ããæ¸¡ãããå ´åãå«ãï¼ã
Promise.any()
å
¥åã¨ãã¦ãããã¹ã®å復å¯è½ãªãã¸ã§ã¯ããåãåããåä¸ã® Promise
ãè¿ãã¾ãããã®è¿ããããããã¹ã¯ãå
¥åããããããã¹ã®ãããããå±¥è¡ãããã¨ãã«å±¥è¡ãããæåã®å±¥è¡å¤ãè¿ãã¾ããå
¥åããããããã¹ããã¹ã¦æå¦ãããå ´åï¼ç©ºã®å復å¯è½ãªãã¸ã§ã¯ããæ¸¡ãããå ´åãå«ãï¼ãæå¦ãããçç±ã®é
åãå«ã AggregateError
ãè¿ãã¾ãã
Promise.race()
å
¥åã¨ãã¦ãããã¹ã®å復å¯è½ãªãã¸ã§ã¯ããåãåããåä¸ã® Promise
ãè¿ãã¾ãããã®è¿ããããã¹ã¯ãæåã«æ±ºå®ãããããã¹ã®æçµçãªç¶æ
ã§æ±ºå®ãã¾ãã
Promise.reject()
ä¸ããããçç±ã§æå¦ãããæ°ãã Promise
ãªãã¸ã§ã¯ããè¿ãã¾ãã
Promise.resolve()
ä¸ããããå¤ã§è§£æ±ºããã Promise
ãªãã¸ã§ã¯ããè¿ãã¾ããããå¤ã Thenable ï¼ã¤ã¾ã then
ã¡ã½ãããæã£ã¦ãããªãã¸ã§ã¯ãï¼ãªãã°ãè¿ããããããã¹ã¯ãã® Thenable ããã©ãããã®çµæãæ¡ç¨ãã¾ããããã§ãªããã°ãè¿ããããããã¹ã¯ä¸ããããå¤ã§å±¥è¡ããã¾ãã
Promise.try()
Experimental
ãããã種é¡ã®ã³ã¼ã«ããã¯ï¼å¾©å¸°ãä¾å¤ããåæçãéåæçã«ãããããï¼ãåãããã®çµæã Promise
ã§ã©ãããã¾ãã
Promise.withResolvers()
Promise()
ã³ã³ã¹ãã©ã¯ã¿ã¼ã®å®è¡å´ã«æ¸¡ããã 2 ã¤ã®å¼æ°ã«å¯¾å¿ãããæ°ãã Promise
ãªãã¸ã§ã¯ãã¨ããã解決ã¾ãã¯æå¦ãã 2 ã¤ã®é¢æ°ãæ ¼ç´ãããªãã¸ã§ã¯ããè¿ãã¾ãã
ãããã®ããããã£ã¯ Promise.prototype
ã§å®ç¾©ããã¦ããããã¹ã¦ã® Promise
ã¤ã³ã¹ã¿ã³ã¹ã§å
±æããã¾ãã
Promise.prototype.constructor
ã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ãã使ããã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã Promise
ã¤ã³ã¹ã¿ã³ã¹ã®å ´åãåæå¤ã¯ Promise
ã³ã³ã¹ãã©ã¯ã¿ã¼ã§ãã
Promise.prototype[Symbol.toStringTag]
[Symbol.toStringTag]
ããããã£ã®åæå¤ã¯æåå "Promise"
ã§ãããã®ããããã£ã¯ Object.prototype.toString()
ã§ä½¿ç¨ããã¾ãã
Promise.prototype.catch()
ãããã¹ã«æå¦ãã³ãã©ã¼ã³ã¼ã«ããã¯ã追å ããã³ã¼ã«ããã¯ãå¼ã³åºãããã¨ãã®è¿å¤ã§è§£æ±ºãããã¾ãã¯ããããã¹ãå±¥è¡ãããå ´åã¯ãå ã®å±¥è¡çµæã§è§£æ±ºãã æ°ãããããã¹ãè¿ãã¾ãã
Promise.prototype.finally()
ãããã¹ã«ãã³ãã©ã¼ã追å ããå ã®ãããã¹ã解決ãããã¨ãã«è§£æ±ºãããæ°ãããããã¹ãè¿ãã¾ãããã®ãã³ãã©ã¼ã¯ãæåã失æãã«é¢ããããå ã®ãããã¹ãå®äºããã¨ãã«å¼ã³åºããã¾ãã
Promise.prototype.then()
ãããã¹ã«å±¥è¡ãã³ãã©ã¼ã¨æå¦ãã³ãã©ã¼ã追å ããå¼ã³åºããããã³ãã©ã¼ã®è¿å¤ã§è§£æ±ºããæ°ãããããã¹ãè¿ãã¾ãããããã¹ãå¦çãããªãã£ãå ´åï¼ããªãã¡ãé¢é£ãããã³ãã©ã¼ onFulfilled
ã¾ã㯠onRejected
ã颿°ã§ã¯ãªãå ´åï¼ã¯ãå
ã®è§£æ±ºå¤ãè¿ãã¾ãã
const myFirstPromise = new Promise((resolve, reject) => {
// resolve(...) ã¯ãéåæã§è¡ã£ã¦ãããã¨ãæåããã¨ãã«å¼ã³åºãã失æããã¨ãã«ã¯ reject(...) ãå¼ã³åºãã¾ãã
// ãã®ä¾ã§ã¯ãsetTimeout(...) ã使ç¨ãã¦éåæã³ã¼ããã¨ãã¥ã¬ã¼ã·ã§ã³ãã¦ãã¾ãã
// å®éã«ã¯ãXHR ã HTML API ã®ãããªãã®ã使ç¨ãããã¨ã«ãªãã¾ãã
setTimeout(() => {
resolve("æå!"); // ãã£ãï¼ãã¾ããã£ãï¼
}, 250);
});
myFirstPromise.then((successMessage) => {
// successMessage ã¯ä¸è¨ã® resolve(...) 颿°ã«æ¸¡ããããã®ã«ãªãã
// æååã¨ã¯éããªãããæåã¡ãã»ã¼ã¸ã ãã§ããã°ããããããããªãã
console.log(`Yay! ${successMessage}`);
});
夿§ãªç¶æ³ã«å¯¾å¿ããä¾
ãã®ä¾ã§ã¯ããããã¹æ©è½ã使ç¨ããããã®å¤æ§ãªãã¯ããã¯ã¨ãçºçããå¯è½æ§ã®ãã夿§ãªç¶æ³ã示ãã¦ãã¾ãããããçè§£ããã«ã¯ãã¾ãã³ã¼ããããã¯ã®ä¸çªä¸ã¾ã§ã¹ã¯ãã¼ã«ãã¦ããããã¹é£éã調ã¹ã¦ãã ãããæåã®ãããã¹ãæä¾ããã¦ããããããã¹ã®é£éãç¶ãã¾ãããã®é£é㯠.then()
ã®å¼ã³åºãã§æ§æãããé常㯠(å¿
ãããããã¨ã¯éãã¾ããã) æå¾ã«åä¸ã® .catch()
ããããä»»æã§ .finally()
ãç¶ãã¾ãããã®ä¾ã§ã¯ããããã¹é£éã¯ç¬èªã«æ¸ããã new Promise()
ã³ã³ã¹ãã©ã¯ã¿ã¼ã«ãã£ã¦éå§ããã¾ãããå®éã«ã¯ããããã¹é£éã¯é常ããããã¹ãè¿ã API 颿° (ä»ã®èª°ããæ¸ãããã®) ããéå§ããã¾ãã
颿° tetheredGetNumber()
ã®ä¾ã§ã¯ãéåæå¼ã³åºããè¨å®ãã¦ããéãã¾ãã¯ã³ã¼ã«ããã¯å
ã§ãã¾ãã¯ãã®ä¸¡æ¹ã§ reject()
ã使ç¨ãã¦ãããã¹ãçæãããã¨ã示ãã¦ãã¾ãã 颿° promiseGetWord()
ã¯ãAPI 颿°ãã©ã®ããã«èªå·±å®çµåã®æ¹æ³ã§ãããã¹ãçæãã¦è¿ããã示ãã¦ãã¾ãã
颿° troubleWithGetNumber()
㯠throw
ã§çµãããã¨ã«æ³¨æãã¦ãã ããããããã¹é£éã§ã¯ãã¹ã¦ã® .then()
ã®ãããã¹ãééãããããã¨ã©ã¼ãçºçããå¾ã§ãthrow
ããªããã¨ã©ã¼ãã解決æ¸ã¿ãã§ããããã«ã¿ãã¦ããå¼·å¶çã«è¡ããã¾ããããã¯é¢åãªã®ã§ã.then()
ãããã¹ã®é£éå
¨ä½ã§ onRejected
ãçç¥ãã¦ãæçµç㪠catch()
ã§åä¸ã® onRejected
ã使ç¨ããã®ãä¸è¬çã§ãã
ãã®ã³ã¼ã㯠NodeJS ã§å®è¡ã§ãã¾ããå®éã«ã¨ã©ã¼ãçºçãã¦ããã®ãè¦ããã¨ã§ç解度ãé«ã¾ãã¾ããããå¤ãã®ã¨ã©ã¼ãå¼·å¶çã«çºçãããã«ã¯ã threshold
ã®å¤ã夿´ãã¦ãã ããã
// ã¨ã©ã¼å¦çãçµé¨ã§ããããã«ã"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("æ°å¤ã®åå¾ã«å¤±æãã¾ãã", { 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("以忱ã£ãã¨ã©ã¼ãããã¾ã");
} else {
console.error(`promiseGetWord() ã«å¤±æ: ${reason}`);
}
})
.finally((info) => console.log("å®äºãã¾ãã"));
é«åº¦ãªä¾
以ä¸ã®ä¾ã¯ Promise
ã®ä»çµã¿ã示ãããã®ã§ãã testPromise()
ã¡ã½ãã㯠<button>
ãã¯ãªãã¯ãã度ã«å¼ã³åºããã¾ããããã¯ãsetTimeout()
ãç¨ãã¦ã 1 ç§ãã 3 ç§ã®ã©ã³ãã ãªæéã®å¾ãã¡ã½ãããããã¾ã§ã«å¼ã°ããåæ°ã§å±¥è¡ããããããã¹ã使ãã¾ãã Promise()
ã³ã³ã¹ãã©ã¯ã¿ã¼ã使ç¨ãã¦ãããã¹ãçæãã¾ãã
ãããã¹ãå±¥è¡ããããã¨ã¯ã p1.then()
ã§è¨å®ãããã³ã¼ã«ããã¯ã«ãã£ã¦è¨é²ããã¾ãããã®è¨é²ãããã¡ã½ããã®åæå¦çé¨åãããããã¹ã«ããéåæå¦çããã©ã®ããã«åé¢ããã¦ãããããããã¾ãã
çæéã«ä½åº¦ããã¿ã³ãã¯ãªãã¯ããã¨ããã¾ãã¾ãªãããã¹ã次ã ã¨å±¥è¡ããã¦ããæ§åãè¦ããã¨ãã§ãã¾ãã
HTML<button id="make-promise">ãããã¹ã使</button>
<div id="log"></div>
JavaScript
"use strict";
let promiseCount = 0;
function testPromise() {
const thisPromiseCount = ++promiseCount;
const log = document.getElementById("log");
// éå§
log.insertAdjacentHTML("beforeend", `${thisPromiseCount}) éå§<br>`);
// æ°ãããããã¹ã使ãã¾ãããã®ãããã¹ã§ 1 ããå§ã¾ãæ°å¤ã®ã«ã¦ã³ããï¼3 ç§ã®å¾
ã¡æéã®å¾ã«ï¼ç´æãã¾ã
const p1 = new Promise((resolve, reject) => {
// ãããã¹ã解決ã¾ãã¯æå¦ããæ©è½ãæã¤å®è¡é¢æ°ãå¼ã³åºããã¾ã
log.insertAdjacentHTML(
"beforeend",
`${thisPromiseCount}) Promise ã³ã³ã¹ãã©ã¯ã¿ã¼<br>`,
);
// ããã¯åã«éåæã«ããããã®ä¾ã«éãã¾ãã
setTimeout(
() => {
// ãããã¹ãå±¥è¡ããã¾ã
resolve(thisPromiseCount);
},
Math.random() * 2000 + 1000,
);
});
// ãããã¹ã解決ãããã¨ãã®å¦çã then() ã®å¼ã³åºãã§å®ç¾©ãã¾ãã
// ãããã¹ãæå¦ãããã¨ãã®å¦çã catch() ã®å¼ã³åºãã§å®ç¾©ãã¦ãã¾ãã
p1.then((val) => {
// Log the fulfillment value
log.insertAdjacentHTML("beforeend", `${val}) Promise å±¥è¡<br>`);
}).catch((reason) => {
// Log the rejection reason
console.log(`ããã§ã¯æå¦ããããããã¹ (${reason}) ãå¦çãã¾ãã`);
});
// çµäº
log.insertAdjacentHTML("beforeend", `${thisPromiseCount}) Promise çæ<br>`);
}
const btn = document.getElementById("make-promise");
btn.addEventListener("click", testPromise);
çµæ XHR ã«ããç»åã®èªã¿è¾¼ã¿
Promise
㨠XMLHttpRequest
ã§ç»åãèªã¿è¾¼ãå¥ã®ä¾ã¯ã MDN ã® GitHub ã® js-examples ãªãã¸ããªã¼ã«ãããåä½ã確èªãããã¨ãã§ãã¾ããããããã®è¡ã®ã³ã¡ã³ãã§ Promise 㨠XHR ã®æ§é ããããããã¯ãã§ãã
è¨å®ãªãã¸ã§ã¯ã (settings object) ã¨ã¯ã JavaScript ã³ã¼ãã®å®è¡æã«è¿½å æ å ±ãæä¾ããç°å¢ã®ãã¨ã§ããããã«ã¯ãé åãã¢ã¸ã¥ã¼ã«ãããã®ã»ãããªãªã¸ã³ãªã©ã® HTML åºæã®æ å ±ãå«ã¾ãã¾ããç¾è¡ã®è¨å®ãªãã¸ã§ã¯ãã追跡ãããã®ã¯ãç¹å®ã®ã¦ã¼ã¶ã¼ã³ã¼ãã«å¯¾ãã¦ã©ã®è¨å®ãªãã¸ã§ã¯ãã使ç¨ãã¹ããããã©ã¦ã¶ã¼ã確å®ã«ææ¡ããããã§ãã
ãããããè¯ãçè§£ããããã«ãé åãã©ã®ããã«åé¡ã«ãªããã詳ããè¦ã¦ã¿ã¾ããããé å (realm) ã¨ã¯ã大ã¾ãã«è¨ãã¨ã°ãã¼ãã«ãªãã¸ã§ã¯ãã®ãã¨ã§ããé åã®ç¹å¾´ã¯ãJavaScript ã®ã³ã¼ããå®è¡ããããã«å¿
è¦ãªæ
å ±ããã¹ã¦ä¿æãã¦ãããã¨ã§ããããã«ã¯ Array
ã Error
ãªã©ã®ãªãã¸ã§ã¯ããå«ã¾ãã¾ããããããã®è¨å®ãªãã¸ã§ã¯ãã¯ãããã®ãã³ãã¼ããæã£ã¦ãããå
±æããã¦ãã¾ããããã®ããããããã¹ã¨ã®é¢ä¿ã§äºæããªãåä½ããããã¨ãããã¾ãããããåé¿ããããã«ãç¾è¡ã®è¨å®ãªãã¸ã§ã¯ã (incumbent settings object) ã¨å¼ã°ãããã®ã追跡ãã¾ããããã¯ããã颿°å¼ã³åºããæ
å½ããã¦ã¼ã¶ã¼ã³ã¼ãã®ã³ã³ããã¹ãã«åºæã®æ
å ±ã表ãã¾ãã
ãããããå°ã詳ãã説æããããã«ãææ¸ã«åãè¾¼ã¾ãã <iframe>
ããã¹ãã¨ã©ã®ããã«éä¿¡ããããè¦ã¦ã¿ã¾ãããããã¹ã¦ã® Web API ã¯ç¾è¡ã®è¨å®ãªãã¸ã§ã¯ããèªèãã¦ããããã以ä¸ã®ããã«ããã°ãã¹ã¦ã®ãã©ã¦ã¶ã¼ã§åä½ãã¾ãã
<!doctype html> <iframe></iframe>
<!-- ãããé åã§ã -->
<script>
// ãããåæ§ã«é åã§ã
const bound = frames[0].postMessage.bind(frames[0], "some data", "*");
// bound ã¯çµã¿è¾¼ã¿é¢æ°ã§ã â ã¹ã¿ãã¯ä¸ã«ã¯ã¦ã¼ã¶ã¼
// ã³ã¼ããããã¾ãã â ããã©ã®é åã使ãã®ã§ããããï¼
setTimeout(bound);
// ããã§ãåä½ãã¾ããã¹ã¿ãã¯ä¸ã®æãè¥ãï¼ç¾è¡ã®ï¼
// é åã使ç¨ããããã§ãã
</script>
åãæ¦å¿µããããã¹ã«é©ç¨ãã¾ããä¸ã®ä¾ãå°ãå¤ãã¦ã¿ãã¨ããããªãã¾ãã
<!doctype html> <iframe></iframe>
<!-- ãããé åã§ã -->
<script>
// ãããåæ§ã«é åã§ã
const bound = frames[0].postMessage.bind(frames[0], "some data", "*");
// bound ã¯çµã¿è¾¼ã¿é¢æ°ã§ã â ã¹ã¿ãã¯ä¸ã«ã¯ã¦ã¼ã¶ã¼
// ã³ã¼ããããã¾ãã â ããã©ã®é åã使ãã®ã§ããããï¼
Promise.resolve(undefined).then(bound);
// ããã§ãåä½ãã¾ããã¹ã¿ãã¯ä¸ã®æãè¥ãï¼ç¾è¡ã®ï¼
// é åã使ç¨ããããã§ãã
</script>
ããã夿´ãã¦ãææ¸å
ã® <iframe>
ã post ã¡ãã»ã¼ã¸ãå¾
ã¡åãããããã«ããã¨ãç¾è¡ã®è¨å®ãªãã¸ã§ã¯ãã®å¹æã観å¯ãããã¨ãã§ãã¾ãã
<!-- 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";
// ãã®ã³ã¼ãã¯ç¾è¡ã®è¨å®ãªãã¸ã§ã¯ãã追跡ãããã©ã¦ã¶ã¼ã§ããåä½ãã¾ãã
console.log(event);
},
false,
);
</script>
ä¸è¨ã®ä¾ã§ã¯ãç¾è¡ã®è¨å®ãªãã¸ã§ã¯ãã追跡ãããã¨ãã®ã¿ <iframe>
ã®å
é¨ã®ããã¹ããæ´æ°ããã¾ããããã¯ãç¾è¡ã®ãã®ã追跡ããªãã¨ãã¡ãã»ã¼ã¸ãéãç°å¢ãééãã¦ãã¾ãå¯è½æ§ãããããã§ãã
ã¡ã¢: ç¾å¨ã®ã¨ãããç¾è¡ã®é åã®è¿½è·¡ã¯ 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