ãããã¹ (Promise
) ã¯ãéåæå¦çã®æçµçãªå®äºãããã¯å¤±æã表ããªãã¸ã§ã¯ãã§ããå¤ãã®äººã
ã¯æ¢åã®ç¨æããããããã¹ã使ããã¨ã«ãªãããããã®ã¬ã¤ãã§ã¯ããããã¹ã®ä½ææ¹æ³ã®åã«ã颿°ãè¿ããããã¹ã®ä½¿ãæ¹ãã説æãã¾ãã
åºæ¬çã«ããããã¹ã¯ã³ã¼ã«ããã¯ã颿°ã«æ¸¡ããããã«ã颿°ãè¿ãããªãã¸ã§ã¯ãã«å¯¾ãã¦ã³ã¼ã«ããã¯ãç»é²ããããã«ããã¨ãããã®ã§ãã createAudioFileAsync()
ã¨ããéåæã«é³å£°ãã¡ã¤ã«ãçæãã颿°ãèãã¦ã¿ã¾ãããããã®é¢æ°ã¯æ§æãªãã¸ã§ã¯ã㨠2 ã¤ã®ã³ã¼ã«ããã¯é¢æ°ãåãåããçæ¹ã®ã³ã¼ã«ããã¯ã¯é³å£°ãã¡ã¤ã«ãç¡äºä½æãããã¨ãã«å¼ã³åºãããããä¸ã¤ã¯ã¨ã©ã¼ãçºçããã¨ãã«å¼ã³åºãããã¨ãã¾ãã
以ä¸ã®ã³ã¼ã㯠createAudioFileAsync()
ã使ç¨ãããã®ã§ãã
function successCallback(result) {
console.log(`Audio file ready at URL: ${result}`);
}
function failureCallback(error) {
console.error(`Error generating audio file: ${error}`);
}
createAudioFileAsync(audioSettings, successCallback, failureCallback);
createAudioFileAsync()
ããããã¹ãè¿ãããã«æ¸ãæããã¨ãã³ã¼ã«ããã¯ã次ã®ããã«å²ãå½ã¦ããã¨ãã§ãã¾ãã
createAudioFileAsync(audioSettings).then(successCallback, failureCallback);
ãã®è¨è¿°æ¹æ³ã«ã¯ããã¤ãå©ç¹ãããã®ã§ãé ã«èª¬æãã¾ãã
é£éãããããã¼ãºã¯ã 2 ã¤ä»¥ä¸ã®éåæå¦çãé£ç¶ãã¦å®è¡ãããã¨ã§ãååã®å¦çãæåããã¨ãã«ããã®çµæããã¨ã«å¾ç¶ã®å¦çãå§ãããã¨ã§ããæã¯ãè¤æ°ã®éåæå¦çãé£ç¶ãã¦å®è¡ããã¨ãå¤å ¸çãªã³ã¼ã«ããã¯å°çã«é¥ã£ã¦ãã¾ããã
doSomething(function (result) {
doSomethingElse(result, function (newResult) {
doThirdThing(newResult, function (finalResult) {
console.log(`æçµçµæ: ${finalResult}`);
}, failureCallback);
}, failureCallback);
}, failureCallback);
ãããã¹ã§ã¯ããããã¹é£éã使ãããã¨ã§ãããå®ç¾ãã¾ãããããã¹ã® API è¨è¨ã§ã¯ãã³ã¼ã«ããã¯ã¯é¢æ°ã«æ¸¡ãããã®ã§ã¯ãªããè¿ããããããã¹ãªãã¸ã§ã¯ãã«åãä»ãããããããããã¯ç´ æ´ããããã¨ã§ãã
ããããããã¸ãã¯ã§ãã then()
颿°ã¯å
ã¨ã¯ç°ãªãæ°ãããããã¹ãè¿ãã¾ãã
const promise = doSomething();
const promise2 = promise.then(successCallback, failureCallback);
2 ã¤ç®ã®ãããã¹ (promise2
) 㯠doSomething()
ã®å®äºã表ãã ãã§ã¯ãªããæ¸¡ãã successCallback
ããã㯠failureCallback
ã®å®äºã表ãããããã®ã³ã¼ã«ããã¯ã¯ãããã¹ãè¿ãã¾ãå¥ã®éåæé¢æ°ã§ãã£ã¦ãæ§ãã¾ããããã®å ´åãpromise2
ã«è¿½å ãããã³ã¼ã«ããã¯ã¯ãããããããã¹ã®ãã¥ã¼ã«ããã¦ãsuccessCallback
ã¾ã㯠failureCallback
ãè¿ããããã¹ã®å¾ãã«è¿½å ããã¾ãã
ã¡ã¢: ãã®ä¾ãå®éã«è©¦ãã¦ã¿ããå ´åã¯ã次ã®ãã³ãã¬ã¼ãã使ç¨ãããã¨ã§ããããã¹ãè¿ãä»»æã®é¢æ°ã使ãããã¨ãã§ãã¾ãã
function doSomething() {
return new Promise((resolve) => {
setTimeout(() => {
// ãããã¹ã®å®äºåã«ããã¹ãä»ã®ãã¨
console.log("ä½ããè¡ãã¾ãã");
// ãããã¹ã®å±¥è¡å¤
resolve("https://example.com/");
}, 200);
});
}
å®è£ ã«ã¤ãã¦ã¯ãä¸è¨ãå¤ãã³ã¼ã«ãã㯠API ãã©ãããã Promise ã®ä½æãã®ç« ã§è©³ãã説æãã¾ãã
ãã®ãã¿ã¼ã³ã使ãã¨ãããé·ãå¦çã®é£éã使ãããã¨ãã§ããããããã®ãããã¹ã¯é£éã®ä¸ã®éåæã¹ãããã®å®äºã表ãã¾ããããã«ã then
ã®å¼æ°ã¯ãªãã·ã§ã³ã§ãcatch(failureCallback)
㯠then(null, failureCallback)
ã®çç¥å½¢ã§ããã¨ã©ã¼å¦çããã³ã¼ãããã¹ã¦ã®æé ã§åãã§ããã°ãããããã§ã¼ã³ã®çµããã«ä»ãããã¨ãã§ãã¾ãã
doSomething()
.then(function (result) {
return doSomethingElse(result);
})
.then(function (newResult) {
return doThirdThing(newResult);
})
.then(function (finalResult) {
console.log(`æçµçµæ: ${finalResult}`);
})
.catch(failureCallback);
代ããã«ãããã¢ãã¼é¢æ°ã§è¡¨ç¾ãã¦ããã®ãè¦ãããããã¾ããã
doSomething()
.then((result) => doSomethingElse(result))
.then((newResult) => doThirdThing(newResult))
.then((finalResult) => {
console.log(`æçµçµæ: ${finalResult}`);
})
.catch(failureCallback);
ã¡ã¢: ã¢ãã¼é¢æ°å¼ã¯æé»ã®è¿å¤ãæã¤ãã¨ãã§ãã¾ãããããã£ã¦ã () => x
㯠() => { return x; }
ã®ç縮形ã§ãã
doSomethingElse
㨠doThirdThing
ã¯ãã©ã®ãããªå¤ã§ãè¿ããã¨ãã§ãã¾ãããããã¹ãè¿ãå ´åã¯ãã¾ããã®ãããã¹ã確å®ããã¾ã§å¾
æ©ãããæ¬¡ã®ã³ã¼ã«ããã¯ã«ã¯ãããã¹èªä½ã§ã¯ãªãå±¥è¡å¤ãè¿ããã¾ãã ãããã¹ã常㫠undefined
ã«è§£æ±ºãããå ´åã§ããthen
ã³ã¼ã«ããã¯ãã常ã«ãããã¹ãè¿ããã¨ãéè¦ã§ããååãã³ãã©ã¼ããããã¹ãå§ãããããããè¿ããªãã£ãå ´åããã®æ±ºå®ã追跡ããæ¹æ³ã¯ãããªãããããã¹ã¯ãæµ®ãã¦ããã (floating) ã¨è¨ãã¾ãã
doSomething()
.then((url) => {
// fetch(url) ã®åã« return ãã¼ã¯ã¼ããå¿ãã¦ãã
fetch(url);
})
.then((result) => {
// çµæã¯æªå®ç¾©ã§ããç´åã®ãã³ãã©ã¼ããã¯ä½ãè¿ãããªãããã§ãã fetch() å¼ã³åºãã®è¿å¤ãç¥ãæ¹æ³ã¯ããããã¾ããããæåãããã©ãããã¾ã£ãããããã¾ããã
});
fetch
ã®å¼ã³åºãçµæï¼ãããã¹ï¼ãè¿ããã¨ã§ãã©ã¡ãããã®å®äºã追跡ããå®äºæã«ãã®å¤ãåãåããã¨ãã§ãã¾ãã
doSomething()
.then((url) => {
// `return` ãã¼ã¯ã¼ãã追å
return fetch(url);
})
.then((result) => {
// çµæã¯ Response ãªãã¸ã§ã¯ã
});
æµ®ãã¦ãããããã¹ã¯ãç«¶åããæ¡ä»¶ãåå¨ããå ´åã«ãããã«æªãçµæãæãå¯è½æ§ãããã¾ããããæå¾ã®ãã³ãã©ã¼ã®ãããã¹ãè¿ãããªããã°ã次㮠then
ãã³ãã©ã¼ãæ©ãå¼ã³åºããããã®ãã³ãã©ã¼ãèªã¿åãå¤ãä¸å®å
¨ã«ãªãå¯è½æ§ãããã¾ãã
const listOfIngredients = [];
doSomething()
.then((url) => {
// fetch(url) ã®åã« return ãã¼ã¯ã¼ããå¿ãã¦ãã
fetch(url)
.then((res) => res.json())
.then((data) => {
listOfIngredients.push(data);
});
})
.then(() => {
console.log(listOfIngredients);
// listOfIngredients ã¯å¸¸ã« [] ã¨ãªãã¾ãããã§ãããªã¯ã¨ã¹ãã¯ã¾ã å®äºãã¦ããªãããã§ãã
});
ãããã£ã¦ãçµé¨åã¨ãã¦ãå¦çããããã¹ã«ééããã¨ãã¯ãã¤ã§ããããè¿ãããã®å¦çãæ¬¡ã® then
ãã³ãã©ã¼ã«å§ããããã«ãã¦ãã ããã
const listOfIngredients = [];
doSomething()
.then((url) => {
// fetch å¼ã³åºãã®åã« `return` ãã¼ã¯ã¼ããå
¥ããããã«ãã
return fetch(url)
.then((res) => res.json())
.then((data) => {
listOfIngredients.push(data);
});
})
.then(() => {
console.log(listOfIngredients);
// listOfIngredients ã«ã¯ fetch å¼ã³åºãããåå¾ããããã¼ã¿ãå
¥ãããã«ãªã
});
ããã«ãå ¥ãåã«ãªã£ããã§ã¼ã³ãåä¸ã®ãã§ã¼ã³ã«ãã©ããåãããã¨ã§ãããã·ã³ãã«ã«ãªããã¨ã©ã¼å¦çã容æã«ãªãã¾ãã詳細ã¯ãä¸è¨ã®å ¥ãåã®ç¯ã§èª¬æãã¾ãã
doSomething()
.then((url) => fetch(url))
.then((res) => res.json())
.then((data) => {
listOfIngredients.push(data);
})
.then(() => {
console.log(listOfIngredients);
});
async
/await
ã使ç¨ããã¨ãããç´æçãªã³ã¼ããæ¸ããã¨ãã§ããåæã³ã¼ãã«ä¼¼ãã³ã¼ããæ¸ããã¨ãã§ãã¾ããæ¬¡ã®ä¾ã¯ã async
/await
ã使ç¨ãã¦ããªããã¨ããã¦ãã¾ãã
async function logIngredients() {
const url = await doSomething();
const res = await fetch(url);
const data = await res.json();
listOfIngredients.push(data);
console.log(listOfIngredients);
}
ã³ã¼ãã¯ãããã¹ã®åã« await
ãã¼ã¯ã¼ãããããã¨ãé¤ãã¦ãåæçãªã³ã¼ãã¨ã¾ã£ããåãã«è¦ãããã¨ã«æ³¨ç®ãã¦ãã ããããã¬ã¼ããªãã®1ã¤ã¯ãawait
ãã¼ã¯ã¼ããç°¡åã«å¿ãã¦ãã¾ãå¯è½æ§ããããã¨ã§ããããã¯ãåä¸ä¸è´ï¼ä¾ãã°ããããã¹ãå¤ã¨ãã¦ä½¿ç¨ãããã¨ãããªã©ï¼ãããå ´åã«ã®ã¿ä¿®æ£ãããã¨ãã§ãã¾ãã
async
/await
ã¯ãããã¹ãåºã«æ§ç¯ããã¦ãã¾ããä¾ãã°ãdoSomething()
ã¯ä»¥åã¨åã颿°ã§ããããããããã¹ãã async
/await
ã«å¤æ´ããããã«å¿
è¦ãªãªãã¡ã¯ã¿ãªã³ã°ã¯æå°éã§æ¸ã¿ã¾ãã async
/await
ã®æ§æã«ã¤ãã¦ã¯ãéåæé¢æ°ããã³ await
ã®ãªãã¡ã¬ã³ã¹ã§è©³ãã説æããã¦ãã¾ãã
ã¡ã¢: async
/await
ã¯é常ã®ãããã¹é£éã¨åã並åå¦çã®æå³è«ããã¡ã¾ãã 1 ã¤ã®éåæé¢æ°å
ã§ await
ã使ç¨ãã¦ããããã°ã©ã å
¨ä½ã忢ããããã§ã¯ãªãããã®å¤ã«ä¾åããé¨åã®ã¿ã忢ãã¾ãããã®ããã await
ãå¾
æ©ä¸ã®éã«ããä»ã«ãéåæã®ã¸ã§ããå®è¡ãããå¯è½æ§ãããã¾ãã
å
ã»ã©ã®æ»ã®ãã©ãããã§ã¯ failureCallback
ã 3 åè¦ããã¨ãæãåºãããããã¾ããã䏿¹ããããã¹é£éã®æå¾ã® 1 åã ãã§ãã
doSomething()
.then((result) => doSomethingElse(result))
.then((newResult) => doThirdThing(newResult))
.then((finalResult) => console.log(`æçµçµæ: ${finalResult}`))
.catch(failureCallback);
ä¾å¤ãçºçããã¨ããã©ã¦ã¶ã¼ã¯é£éããã©ã£ã¦ .catch()
ãã³ãã©ã¼ã onRejected
ãæ¢ãã¾ãããã®åä½ã¯åæçãªã³ã¼ãã®åä½ã¨ã¨ã¦ãããä¼¼ã¦ãã¾ãã
try {
const result = syncDoSomething();
const newResult = syncDoSomethingElse(result);
const finalResult = syncDoThirdThing(newResult);
console.log(`æçµçµæ: ${finalResult}`);
} catch (error) {
failureCallback(error);
}
ããã«å¯¾å¿ãããã®ã async
/await
ã®æ§æã§éåæã³ã¼ãã«éç´ãããã®ã§ãã
async function foo() {
try {
const result = await doSomething();
const newResult = await doSomethingElse(result);
const finalResult = await doThirdThing(newResult);
console.log(`æçµçµæ: ${finalResult}`);
} catch (error) {
failureCallback(error);
}
}
ãããã¹ã¯ãã³ã¼ã«ããã¯ã®æ»ã®ãã©ãããã®æ ¹æ¬çãªæ¬ é¥ã解決ãã¾ããä¾å¤ãããã°ã©ãã³ã°ã¨ã©ã¼ãªã©ããã¹ã¦ã®ã¨ã©ã¼ãææãã¾ããããã¯éåææä½ã®æ©è½åæã«ä¸å¯æ¬ ã§ããããã§ãã¨ã©ã¼ã¯ãã¹ã¦ãã§ã¼ã³ã®çµããã«ãã catch()
ã¡ã½ããã§å¦çããããã¨ã«ãªãã async
/await
ã使ç¨ããã« try
/catch
ã使ç¨ããå¿
è¦ã¯ã»ã¨ãã©ãªããªãã¾ãã
ä¸ã® listOfIngredients
ã«é¢ããä¾ã§ã¯ãæåã®ãããã¹é£éã¯å¥ã® then()
ãã³ãã©ã¼ã®è¿å¤ã«å
¥ãåã«ãªã£ã¦ãã¾ããã 2 ã¤ç®ã¯å®å
¨ã«ãã©ãããªé£éã使ç¨ãã¦ãã¾ããåç´ãªãããã¹é£éã¯ãå
¥ãåãããã«ãã©ããã«ä¿ã¤ã®ããã¹ãã§ããå
¥ãåã«ããã¨ã䏿³¨æãªåæã®çµæã«ãªã£ã¦ãã¾ãå¯è½æ§ãããããã§ãã
å
¥ãåã¯ã catch
æã®ç¯å²ãå¶éããããã®å¶å¾¡æ§é ã§ããå
·ä½çã«ã¯ãå
¥ãåã«ãªã£ã catch
ã¯ããã®ã¹ã³ã¼ã以ä¸ã®ã¨ã©ã¼ã®ã¿ãææããå
¥ãåã«ãªã£ãã¹ã³ã¼ãã®å¤å´ã«ããé£éã®ä¸ä½ã®ã¨ã©ã¼ã¯ææãã¾ãããæ£ãã使ç¨ããã°ãã¨ã©ã¼å復ã®ç²¾åº¦ãé«ã¾ãã¾ãã
doSomethingCritical()
.then((result) =>
doSomethingOptional(result)
.then((optionalResult) => doSomethingExtraNice(optionalResult))
.catch((e) => {}),
) // ãªãã·ã§ã³ã®å¦çã失æããã°ç¡è¦ãã¦é²ãã
.then(() => moreCriticalStuff())
.catch((e) => console.error(`Critical failure: ${e.message}`));
ã¤ã³ãã³ãã§ã¯ãªãå¤å´ã® (
ããã³ )
ã«ãã£ã¦ãªãã·ã§ã³ã®å¦çãå
¥ãåã«ãªã£ã¦ãããã¨ã«æ³¨æãã¦ãã ããã
å
å´ã® catch
æã¯ doSomethingOptional()
㨠doSomethingExtraNice()
ããã®å¤±æã ããææããææããã㨠moreCriticalStuff()
ã¸ã¨å¦çãç¶ãã¾ããéè¦ãªã®ã¯ããã doSomethingCritical()
ã失æããããã®ã¨ã©ã¼ã¯æå¾ (å¤å´) ã® catch
ã«ãã£ã¦ã ãææãããã¨ãããã¨ã§ãã
async
/await
ã®å ´åããã®ã³ã¼ãã¯æ¬¡ã®ããã«ãªãã¾ãã
async function main() {
try {
const result = await doSomethingCritical();
try {
const optionalResult = await doSomethingOptional(result);
await doSomethingExtraNice(optionalResult);
} catch (e) {
// ãªãã·ã§ã³æ®µéã§ã®å¤±æã¯ç¡è¦ãã¦ã次ã«é²ã
}
await moreCriticalStuff();
} catch (e) {
console.error(`Critical failure: ${e.message}`);
}
}
ã¡ã¢: é«åº¦ãªã¨ã©ã¼å¦çãåå¨ããªãã®ã§ããã°ãå
¥ãåã«ãªã£ã then
ãã³ãã©ã¼ãå¿
è¦ã«ãªããã¨ã¯ã¾ãããã¾ããã ãã®ä»£ããã«ããã©ãããã§ã¼ã³ã使ç¨ããã¨ã©ã¼å¦çãã¸ãã¯ãææ«ã«é
ç½®ãã¦ãã ããã
失æãã¤ã¾ã catch
ã®å¾ã«é£éãããã¨ãå¯è½ã§ãããã¯é£éå
ã®åä½ã失æããå¾ã§ãæ°ããåä½ãè¡ãã®ã«ä¾¿å©ã§ããæ¬¡ã®ä¾ãèªãã§ãã ããã
doSomething()
.then(() => {
throw new Error("ä½ã失æãã");
console.log("ãããå®è¡");
})
.catch(() => {
console.error("ãããå®è¡");
})
.then(() => {
console.log("以åã«ä½ãèµ·ãã£ãã¨ãã¦ãããããè¡ã");
});
ããã¯ä¸è¨ã®ããã¹ããåºåãã¾ãã
Initial ãããå®è¡ 以åã«ä½ãèµ·ãã£ãã¨ãã¦ãããããè¡ã
ã¡ã¢: ããããå®è¡ãã®ããã¹ãã¯ãä½ã失æãããã¨ã©ã¼ãæå¦ããå¼ãèµ·ããããããåºåãããªããã¨ã«æ³¨æãã¦ãã ããã
async
/await
ã§ã¯ããã®ã³ã¼ãã¯æ¬¡ã®ããã«ãªãã¾ãã
async function main() {
try {
await doSomething();
throw new Error("ä½ã失æãã");
console.log("ãããå®è¡");
} catch (e) {
console.error("ãããå®è¡");
}
console.log("以åã«ä½ãèµ·ãã£ãã¨ãã¦ãããããè¡ã");
}
ãããã¹ã®æå¦ã¤ãã³ã
ãããã¹æå¦ã¤ãã³ããã©ã®ãã³ãã©ã¼ã«ãã£ã¦ãå¦çãããªãã£ãå ´åããã®ã¤ãã³ãã¯å¼ã³åºãã¹ã¿ãã¯ã®å
é ã«ãããªã³ã°ãããã¹ãã¯ããã表é¢åãããå¿
è¦ãããã¾ããã¦ã§ãã§ã¯ããããã¹ãæå¦ããããã³ã«ã 2 種é¡ã®ã¤ãã³ãã®ã©ã¡ãããã°ãã¼ãã«ã¹ã³ã¼ãã«éããã¾ãï¼ä¸è¬çã«ã¯ã window
ããã¦ã§ãã¯ã¼ã«ã¼ã§ä½¿ç¨ããå ´åã¯ã Worker
ãã¾ãã¯ä»ã®ã¯ã¼ã«ã¼ãã¼ã¹ã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ãï¼ããã® 2 ã¤ã®ã¤ãã³ãã¯æ¬¡ã®éãã§ãã
unhandledrejection
ãããã¹ãæå¦ããããã®ã®ãæå¦ãã³ãã©ã¼ãå©ç¨ã§ããªãå ´åã«éããã¾ãã
rejectionhandled
ãããã¹ãæå¦ãããã¨ããå®è¡è
ã® reject
颿°ã«ãã£ã¦æå¦ãå¦çãããå¾ã«éããã¾ãã
ãããã®å ´åã§ãããã®ï¼PromiseRejectionEvent
åã®ï¼ã¤ãã³ãã¯ãæå¦ããããããã¹ã示ã promise
ããããã£ã¨ããã®ãããã¹ã失æããçç±ã表ã reason
ããããã£ãæã¡ã¾ãã
ãããã®ã¤ãã³ãã使ãã°ããããã¹ã®ã¨ã©ã¼å¦çã®ãã©ã¼ã«ããã¯ãæå®ãããã¨ãã§ããã¾ããããã¹ã管çããéã®åé¡ããããã°ããã®ã«ãå½¹ç«ã¡ã¾ãããããã®ãã³ãã©ã¼ã¯ã³ã³ããã¹ããã¨ã«ã°ãã¼ãã«ã§ãããçºçå ã«é¢ãããããã¹ã¦ã®ã¨ã©ã¼ãåãã¤ãã³ããã³ãã©ã¼ã«ãã£ã¦å¦çããã¾ãã
Node.js ã§ã¯ããããã¹ã®æå¦ã®æ±ãã¯å¤å°ç°ãªãã¾ããæ¬¡ã®ããã«ã㦠Node.js ã« unhandledRejection
ã¤ãã³ãï¼ååã®å¤§æåå°æåã®éãã«æ³¨æï¼ã®ãã³ãã©ã¼ã追å ãããã¨ã§ãæªå¦çã®æå¦ãææãããã¨ãã§ãã¾ãã
process.on("unhandledRejection", (reason, promise) => {
// "promise" ããã³ "reason" ã®å¤ãæ¤æ»ããã³ã¼ããããã«è¿½å
});
Node.js ã§ã¯ãã¨ã©ã¼ãã³ã³ã½ã¼ã«ã«è¨é²ãããã㨠(ããããªãã¨çºçããæ¢å®ã®ã¢ã¯ã·ã§ã³) ãé²ãã«ã¯ã process.on()
ãªã¹ãã¼ã追å ããã ãã§ååã§ãããã©ã¦ã¶ã¼ã®å®è¡ç°å¢ã® preventDefault()
ã®ãããªãã¨ãè¡ãå¿
è¦ã¯ããã¾ããã
ãããã process.on
ãªã¹ãã¼ã追å ãã¦ãããã®ä¸ã«æå¦ããããããã¹ãå¦çããã³ã¼ãããªããã°ããããã¹ã¯åºã«è½ã¡ã¦æé»ã«ç¡è¦ããã¦ãã¾ãã¾ãããã®ãããã§ããã°ãªã¹ãã¼å
ã«ã³ã¼ãã追å ãã¦ãæå¦ããããããã¹ãããããæ¤è¨¼ããå®éã®ã³ã¼ãã®ãã°ãåå ã§ã¯ãªããã¨ã確èªãã¦ãã ããã
éåæå¦çãåæã«å®è¡ããããã® 4 ã¤ã®åæãã¼ã«ãããã¾ãã Promise.all()
ãPromise.allSettled()
ãPromise.any()
ãPromise.race()
ã§ãã
以ä¸ã®ããã«è¤æ°ã®å¦çã並è¡ã«éå§ãããã¹ã¦ãçµäºããã®ãå¾ ã¤ãã¨ãã§ãã¾ãã
Promise.all([func1(), func2(), func3()]).then(([result1, result2, result3]) => {
// result1, result2, result3 ã使ç¨
});
注æãã¹ãã¯ãé
åã®ä¸ã® 1 ã¤ã®ãããã¹ãæå¦ãããã¨ã Promise.all()
ããã®ã¨ã©ã¼ãçºçãããä»ã®å¦çã䏿ãããã¨ã§ããããã«ãããäºæãã¬ç¶æ
ãæ¯ãèããçºçããå¯è½æ§ãããã¾ãã Promise.allSettled()
ã¯ã解決ããåã«ãã¹ã¦ã®æä½ãå®äºãããã¨ãä¿è¨¼ããå¥ã®åæãã¼ã«ã§ãã
ãããã®ã¡ã½ããã¯ãã¹ã¦ãããã¹ã並åå¦çãã¾ããä¸é£ã®ãããã¹ã¯åæã«éå§ãããä»ã«ãå¾ ã¤ãã¨ã¯ããã¾ãããããã¤ãã®è³¢ã JavaScript ã使ç¨ãããã¨ã§ã鿬¡åæãå¯è½ã§ãã
[func1, func2, func3]
.reduce((p, f) => p.then(f), Promise.resolve())
.then((result3) => {
// result3 ã使ç¨
});
ãã®ä¾ã§ã¯ãéåæé¢æ°ã®é åããããã¹é£éã«ç¸®å°ãã¦ãã¾ããä¸ã®ã³ã¼ãã¯æ¬¡ã®ã³ã¼ãã¨åãã§ãã
Promise.resolve()
.then(func1)
.then(func2)
.then(func3)
.then((result3) => {
/* result3 ãä½¿ç¨ */
});
ããã¯ã颿°åããã°ã©ãã³ã°ã§ããè¦ããããåå©ç¨å¯è½ãªåæé¢æ°ã«ãããã¨ãã§ãã¾ãã
const applyAsync = (acc, val) => acc.then(val);
const composeAsync =
(...funcs) =>
(x) =>
funcs.reduce(applyAsync, Promise.resolve(x));
composeAsync()
颿°ã¯ãä»»æã®æ°ã®é¢æ°ã弿°ã¨ãã¦åãåããåæãã¤ãã©ã¤ã³ã«æ¸¡ãããåæå¤ãåãåãæ°ãã颿°ãè¿ãã¾ãã
const transformData = composeAsync(func1, func2, func3);
const result3 = transformData(data);
ç´åçãªåæã¯ async/await ã§ãã£ã¨ç°¡åã«æ¸ããã¨ãã§ãã¾ãã
let result;
for (const f of [func1, func2, func3]) {
result = await f(result);
}
/* æçµçãªçµæ (ããªãã¡ result3) ãä½¿ç¨ */
ãããããããã¹ã鿬¡çã«æ§æããåã«ããããå®ã«å¿ è¦ãã©ãããæ¤è¨ãã¦ãã ããããããããã¹ã®å®è¡ãä»ã®ãããã¹ã®çµæã«ä¾åãã¦ããªãéããããããä¸å¿ è¦ã«ãããã¯ãåããªãããã«ã常ã«ãããã¹ä¸¦åå¦çãå®è¡ããæ¹ãããã®ã§ãã
ãã£ã³ã»ã«Promise
èªä½ã«ã¯åãæ¶ãç¨ã®ç¬¬ä¸ç´ãããã³ã«ã¯åå¨ãã¾ããããé常㯠AbortController
ã使ç¨ãã¦ãåºç¤ã¨ãªãéåææä½ãç´æ¥åãæ¶ããã¨ãã§ããå ´åãããã¾ãã
Promise
ã¯ã³ã³ã¹ãã©ã¯ã¿ã¼ã使ã£ã¦ 1 ããçæããã¨ãã§ãã¾ãããããå¿
è¦ã«ãªãã®ã¯å¤ã API ãã©ããããå ´åã®ã¿ã§ãããã
çæ³çã«ã¯ããã¹ã¦ã®éåæé¢æ°ã¯ãããã¹ãè¿ãã¯ãã§ãããæ®å¿µãªãã API ã®ä¸ã«ã¯ãã¾ã ã«å¤ãããæ¹ã§æå/失æç¨ã®ã³ã¼ã«ããã¯ã渡ãã¦ãããã®ãããã¾ããé¡èãªä¾ã¨ãã¦ã¯ setTimeout()
颿°ãããã¾ãã
setTimeout(() => saySomething("10 seconds passed"), 10 * 1000);
å¤ãæ§å¼ã§ããã³ã¼ã«ããã¯ã¨ãããã¹ã®æ··å¨ã¯åé¡ãå¼ãèµ·ããã¾ããã¨ããã®ã¯ãsaySomething()
ã失æãããããã°ã©ãã³ã°ã¨ã©ã¼ãå«ãã§ããå ´åã«ããã®ã¨ã©ã¼ãã¨ãããããªãããã§ããsetTimeout()
ã«ãã®è²¬ä»»ãããã¾ãã
幸ãã«ã setTimeout()
ããããã¹ã®ä¸ã«ã©ãããããã¨ãã§ãã¾ããè¯ãããæ¹ã¯ãåé¡ã®ãã颿°ãã§ããéãä½ãæ°´æºã§ã©ããããä¸ã§ãç´æ¥å¼ã³åºããªãããã«ãããã¨ã§ãã
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
wait(10 * 1000)
.then(() => saySomething("10 seconds"))
.catch(failureCallback);
ãããã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ããããã¹ãæåã§è§£æ±ºãããæå¦ãããããããã®å®è¡é¢æ°ãåãåãã¾ãã setTimeout()
ã¯å®ã«å¤±æããªãã®ã§ãä»åã¯æå¦ãçãã¾ããããããã©ã®ããã«åä½ããã®ãã«ã¤ãã¦ã¯ã Promise()
ãåç
§ãã¦ãã ããã
æå¾ã«ãç»é²ãããã³ã¼ã«ããã¯ããã¤å¼ã³åºããããã«ã¤ãã¦ãããæè¡çãªè©³ç´°ãè¦ã¦ããã¾ãã
ä¿è¨¼ã³ã¼ã«ããã¯ãã¼ã¹ã® API ã§ã¯ããã¤ãã©ã®ããã«ã³ã¼ã«ããã¯ãå¼ã³åºããããã¯ã API ã®å®è£ è ã«ä¾åãã¾ããä¾ãã°ãã³ã¼ã«ããã¯ã¯åæçã«å¼ã³åºããããã¨ãããã°ãéåæçã«å¼ã³åºããããã¨ãããã¾ãã
function doSomething(callback) {
if (Math.random() > 0.5) {
callback();
} else {
setTimeout(() => callback(), 1000);
}
}
ä¸è¨ã®è¨è¨ã¯ããããããã¶ã«ã´ã®ç¶æ ãã¨ããç¶æ ã«ãªããããå¼·ãé¿ããã¹ãã§ããéåæ API ã®è¨è¨ã®æèã§ã¯ãããã¯ã³ã¼ã«ããã¯ãããå ´åã«ã¯åæçã«å¼ã³åºããã¾ãããä»ã®å ´åã«ã¯éåæçã«å¼ã³åºãããå¼ã³åºãå´ã«ææ§ãã使ãããã¨ãæå³ãã¦ãã¾ããããã«è©³ããèæ¯ã«ã¤ãã¦ã¯ããã®ç¨èªãæåã«æ£å¼ã«è¡¨ç¤ºãããè¨äº Designing APIs for Asynchrony ãåç §ãã¦ãã ããããã® API è¨è¨ã«ãããå¯ä½ç¨ãåæãããã¨ãé£ãããªãã¾ãã
let value = 1;
doSomething(() => {
value = 2;
});
console.log(value); // 1 or 2?
䏿¹ã§ããããã¹ã¯å¶å¾¡ã®å転ã¨ããå½¢ã§ããã³ã¼ã«ããã¯ãå¼ã³åºãããã¿ã¤ãã³ã°ã API å®è£ è ãå¶å¾¡ãããã¨ã¯ããã¾ããããã®ä»£ããã«ãã³ã¼ã«ããã¯ãã¥ã¼ãç¶æãããã¤ã³ã¼ã«ããã¯ãå¼ã³åºãããæ±ºå®ããä»äºã¯ãããã¹ã®å®è£ ã«å§ãããã API ã¦ã¼ã¶ã¼ã¨ API éçºè ã®ä¸¡æ¹ã¯ãèªåçã«ä»¥ä¸ã®ãããªå¼·åãªæå³ã¥ãä¿è¨¼ãå¾ããã¨ãã§ãã¾ãã
then()
ã§è¿½å ãããã³ã¼ã«ããã¯ã¯ã JavaScript ã®ã¤ãã³ãã«ã¼ãã®ç¾å¨ã®å®è¡ã®å®äºããåã«å¼ã³åºããããã¨ã¯ããã¾ãããthen()
ãè¤æ°åå¼ã³åºããã¨ã§ãè¤æ°ã®ã³ã¼ã«ããã¯ã追å ãããã¨ãã§ãã¾ãããããã¯æ¿å
¥ãããé ã«æ¬¡ã
ã¨å¼ã³åºããã¾ããæ³å®å¤ã®äºæ
ã¨ãªããªãããããã¨ããã§ã«è§£æ±ºããããããã¹ã§ãã£ã¦ãã then()
ã«æ¸¡ããã颿°ãåæçã«å¼ã³åºããããã¨ã¯ããã¾ããã
Promise.resolve().then(() => console.log(2));
console.log(1);
// Logs: 1, 2
渡ããã颿°ã¯ããã«å®è¡ãããã®ã§ã¯ãªãããã¤ã¯ãã¿ã¹ã¯ã®ãã¥ã¼ã«å ¥ãããã¾ããå¾ã§ï¼çæãã颿°ãçµäºãã JavaScript ã®å®è¡ã¹ã¿ãã¯ã空ã«ãªã£ã¦ããï¼ãã¤ãã³ãã«ã¼ãã«å¶å¾¡ãæ»ãããç´åãã¤ã¾ãããªãæ©ã段éã§å®è¡ããã¾ãã
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
wait(0).then(() => console.log(4));
Promise.resolve()
.then(() => console.log(2))
.then(() => console.log(3));
console.log(1); // 1, 2, 3, 4
ã¿ã¹ã¯ãã¥ã¼ã¨ãã¤ã¯ãã¿ã¹ã¯
ãããã¹ã®ã³ã¼ã«ããã¯ã¯ãã¤ã¯ãã¿ã¹ã¯ã¨ãã¦å¦çããã setTimeout()
ã³ã¼ã«ããã¯ã¯ã¿ã¹ã¯ãã¥ã¼ã¨ãã¦æ±ããã¾ãã
const promise = new Promise((resolve, reject) => {
console.log("Promise callback");
resolve();
}).then((result) => {
console.log("Promise callback (.then)");
});
setTimeout(() => {
console.log("event-loop cycle: Promise (fulfilled)", promise);
}, 0);
console.log("Promise (pending)", promise);
ä¸è¨ã®ã³ã¼ãã®åºåã¯æ¬¡ã®éãã§ãã
Promise callback Promise (pending) Promise {<pending>} Promise callback (.then) event-loop cycle: Promise (fulfilled) Promise {<fulfilled>}
詳ããã¯ãã¿ã¹ã¯ã¨ãã¤ã¯ãã¿ã¹ã¯ãåç §ãã¦ãã ããã
ãããã¹ã¨ã¿ã¹ã¯ãè¡çªããã¨ããããã¹ã¨ã¿ã¹ã¯ï¼ã¤ãã³ããã³ã¼ã«ããã¯ãªã©ï¼ãäºæ¸¬ä¸å¯è½ãªé åºã§çºè¡ããã¦ããç¶æ³ã«ééããå ´åããã¤ã¯ãã¿ã¹ã¯ã使ç¨ãã¦ç¶æ ããã§ãã¯ãããããããã¹ãæ¡ä»¶ä»ãã§ä½æããã¦ããå ´åã«ãããã¹ã®ãã©ã³ã¹ãåã£ãããããã¨ãæçã§ããå¯è½æ§ãããã¾ãã
ãã¤ã¯ãã¿ã¹ã¯ããã®åé¡ã®è§£æ±ºã«å½¹ç«ã¤ã¨æãããå ´åã¯ããã¤ã¯ãã¿ã¹ã¯ã¬ã¤ãã§ queueMicrotask()
ã使ç¨ãã¦é¢æ°ããã¤ã¯ãã¿ã¹ã¯ã¨ãã¦ãã¥ã¼ã«å
¥ããæ¹æ³ã«ã¤ãã¦è©³ãã説æãã¦ãã¾ãã
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