ã³ã¼ã«ããã¯ãpromise ãä»ã®æ½è±¡çãªæ¦å¿µã®ä½¿ç¨æ³ã示ãããã«ãããã¤ãã®ãã©ã¦ã¶ã¡ã½ããã使ç¨ãã¾ããå ·ä½çã«ã¯ãã¹ã¯ãªããã®èªã¿è¾¼ã¿ã¨åç´ãªããã¥ã¡ã³ãæä½ã®å®è¡ã§ãã
ãããã®ã¡ã½ããã«é¦´æã¿ããªããä¾ã§ã®ä½¿ç¨æ³ããããã«ããå ´åããã¥ã¼ããªã¢ã«ã® 次ã®ãã¼ã ã®ããã¤ãã®ç« ãèªããã¨ããããããã¾ãã
å¤ãã®é¢æ°ã¯ éåæ ã¢ã¯ã·ã§ã³ãã¹ã±ã¸ã¥ã¼ã«ã§ãã JavaScript ãã¹ãç°å¢ã«ãã£ã¦æä¾ããã¾ããã¤ã¾ããä»éå§ããã¢ã¯ã·ã§ã³ã§ãããå¾ã§çµäºãã¾ãã
ä¾ãã°ããã®ãããªé¢æ°ã®1ã¤ã¨ã㦠setTimeout 颿°ãããã¾ãã
éåæã¢ã¯ã·ã§ã³ã®å®éã®ä¾ã¯ä»ã«ãããã¾ããä¾ãã°ã¹ã¯ãªããã¨ã¢ã¸ã¥ã¼ã«ã®èªã¿è¾¼ã¿ã§ãï¼å¾è¿°ã®ç« ã§èª¬æãã¾ãï¼ã
æå®ããã src ã§ã¹ã¯ãªããããã¼ããã颿° loadScript(src) ãè¦ã¦ãã ããã:
function loadScript(src) {
// <script> ã¿ã°ãä½ããã¼ã¸ã«è¿½å ãã¾ã
// æå®ããã src ã®ã¹ã¯ãªããã®èªã¿è¾¼ã¿ãéå§ããå®äºæã«å®è¡ãã¾ã
let script = document.createElement('script');
script.src = src;
document.head.append(script);
}
ããã¯ãæå®ããã src ããã¤ãæ°ãã«åçã«ä½æããã <script src="â¦"> ãããã¥ã¡ã³ãã«æ¿å
¥ãã¾ãããã©ã¦ã¶ã¯èªåçã«èªã¿è¾¼ã¿ãéå§ããå®äºæã«å®è¡ãã¾ãã
使ç¨ä¾:
// ã¹ã¯ãªãããèªã¿è¾¼ã¿ãå®è¡ãã
loadScript('/my/script.js');
ã¹ã¯ãªãã㯠âéåæã«â å®è¡ãããããã«èªã¿è¾¼ã¿ãéå§ãã¾ãããå¾ã§ï¼é¢æ°ããã§ã«çµäºããå¾ï¼å®è¡ããã¾ãã
ã¾ããloadScript ã®ä¸ã«ãªãããã®ã³ã¼ããããå ´åããã®ã³ã¼ãã®å®è¡ã¯ãã¹ã¯ãªããã®èªã¿è¾¼ã¿ã®çµäºã¯å¾
ã¡ã¾ããã
loadScript('/my/script.js');
// loadScript ã®ä¸ã®ã³ã¼ãã¯
// ã¹ã¯ãªããã®èªã¿è¾¼ã¿ãçµããã®ãå¾
ã¡ã¾ãã
// ...
ä»ãæ°ããã¹ã¯ãªãããèªã¿è¾¼ãã§ããã«ä½¿ãããã¨ãã¾ããæ°ãã颿°ã宣è¨ããã¦ãããããããå®è¡ãããã¨ãã¾ãã
ããããloadScript(â¦) å¼ã³åºãã®ç´å¾ã«ããããã¦ã䏿ãåä½ãã¾ãã:
loadScript('/my/script.js'); // ãã®ã¹ã¯ãªãã㯠"function newFunction() {â¦}" ãæã£ã¦ãã¾ã
newFunction(); // ãã®ãããªé¢æ°ã¯ããã¾ãã!
å½ç¶ããã©ã¦ã¶ã«ã¯ã¹ã¯ãªããããã¼ãããæéã¯ããã¾ããã§ãããä»ã®ã¨ãããloadScript 颿°ã¯èªã¿è¾¼ã¿ã®å®äºã追跡ããæ¹æ³ãæä¾ãã¦ãã¾ãããã¹ã¯ãªããã¯èªã¿è¾¼ã¾ããæçµçã«å®è¡ããã¾ããããã®ã¹ã¯ãªããã®æ°ãã颿°ã夿°ã使ç¨ããããã«ããããããã¤èµ·ããã®ããç¥ãããã§ãã
loadScript ã«2ã¤ç®ã®å¼æ°ã«ãã¹ã¯ãªãããèªã¿è¾¼ã¾ããã¨ãã«å®è¡ãã callback 颿°ã追å ãã¾ããã:
function loadScript(src, callback) {
let script = document.createElement('script');
script.src = src;
script.onload = () => callback(script);
document.head.append(script);
}
ãã¼ãããã¹ã¯ãªããã«ããæ°ãã颿°ãå¼ã³ããå ´å㯠callback ã«æ¸ãã¾ãã:
loadScript('/my/script.js', function() {
// ã³ã¼ã«ããã¯ã¯ã¹ã¯ãªããããã¼ãå¾ã«å®è¡ããã¾ã
newFunction(); // ãªã®ã§ãããã¯åä½ãã¾ã
...
});
第2弿°ã¯ãã¢ã¯ã·ã§ã³ãå®äºããã¨ãã«å®è¡ããã颿°ï¼é常ã¯ç¡åï¼ã§ãã
ããã§ãå®éã®ã¹ã¯ãªããã使ã£ãå®è¡å¯è½ãªä¾ã示ãã¾ã:
function loadScript(src, callback) {
let script = document.createElement('script');
script.src = src;
script.onload = () => callback(script);
document.head.append(script);
}
loadScript('https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.2.0/lodash.js', script => {
alert(`Cool, the ${script.src} is loaded`);
alert( _ ); // ãã¼ããããã¹ã¯ãªããã§å®£è¨ããã¦ãã颿°
});
ãã㯠âã³ã¼ã«ããã¯ãã¼ã¹â ã¨å¼ã°ããéåæããã°ã©ãã³ã°ã®ã¹ã¿ã¤ã«ã§ããéåæã®å¦çããã颿°ã¯ã颿°ãå®äºããå¾ã«å®è¡ããããã® callback ã®å¼æ°ãæä¾ãã¾ãã
ããã§ã¯ loadScript ã§ãããè¡ãã¾ãããããã¡ããä¸è¬çãªã¢ããã¼ãã§ãã
Callback ã®ä¸ã® callback
ï¼ã¤ã®ã¹ã¯ãªãããé æ¬¡èªã¿è¾¼ãæ¹æ³: æåã®ï¼ã¤ãèªã¿è¾¼ã¿ã2ã¤ç®ã¯ãã®å¾ã«èªã¿è¾¼ãï¼
èªç¶ãªè§£æ±ºçã¯ã2ã¤ç®ã® loadScript å¼ã³åºãã callback ã®ä¸ã«ç½®ããã¨ã§ããæ¬¡ã®ããã«ãªãã¾ã:
loadScript('/my/script.js', function(script) {
alert(`Cool, the ${script.src} is loaded, let's load one more`);
loadScript('/my/script2.js', function(script) {
alert(`Cool, the second script is loaded`);
});
});
å¤å´ã® loadScript ã®å®äºå¾ããã®ã³ã¼ã«ããã¯ã¯å
å´ã® loadScript ãéå§ãã¾ãã
â¦ä»®ã«ãã£ã¨ã¹ã¯ãªãããèªã¿è¾¼ã¿ããå ´åã¯ã©ããªãã¾ããï¼
loadScript('/my/script.js', function(script) {
loadScript('/my/script2.js', function(script) {
loadScript('/my/script3.js', function(script) {
// ...ãã¹ã¦ã®ã¹ã¯ãªãããèªã¿è¾¼ã¾ããã¾ã§ç¶ãã¾ã
});
})
});
ãããã£ã¦ããã¹ã¦ã®æ°ããã¢ã¯ã·ã§ã³ã¯ã³ã¼ã«ããã¯ã®ä¸ã§ããã¢ã¯ã·ã§ã³ãå¤ããªãå ´åã¯åé¡ããã¾ããããå¤ãå ´åã«ã¯åé¡ã§ãããã®ããããã®å¾å¥ã®æ¹æ³ãè¦ã¦ããã¾ãã
ã¨ã©ã¼ãã³ããªã³ã°
ä¸ã®ä¾ã§ã¯ã¨ã©ã¼ãèæ ®ãã¦ãã¾ããã§ãããããã¹ã¯ãªããèªã¿è¾¼ã¿ã失æããå ´åã©ããã¾ããï¼ã³ã¼ã«ããã¯ã¯ããã«å¯¾å¿ããå¿ è¦ãããã¾ãã
ããã¯ãèªã¿è¾¼ã¿ã¨ã©ã¼ã追跡ãã loadScript ã®æ¹è¯çã§ã:
function loadScript(src, callback) {
let script = document.createElement('script');
script.src = src;
script.onload = () => callback(null, script);
script.onerror = () => callback(new Error(`Script load error for ${src}`));
document.head.append(script);
}
ããã¯æåæã« callback(null, script) ãå¼ã³ããã以å¤ã®å ´åã«ã¯ callback(error) ãå¼ã³ã¾ãã
ä½¿ç¨æ¹æ³:
loadScript('/my/script.js', function(error, script) {
if (error) {
// ã¨ã©ã¼å¦ç
} else {
// ã¹ã¯ãªããã®èªã¿è¾¼ã¿ãæå
}
});
ããä¸åº¦è¨ãã¾ãããloadScript ã§ä½¿ã£ãæ¹æ³ã¯ãå®éã«é常ã«ä¸è¬çãªãã®ã§ãããã㯠âã¨ã©ã¼ãã¡ã¼ã¹ããªã³ã¼ã«ããã¯â ã¹ã¿ã¤ã«ã¨å¼ã°ãã¾ãã
æ £ä¾ã¯æ¬¡ã®éãã§ã:
callbackã®æåã®å¼æ°ã¯ãã¨ã©ã¼ãçºçããå ´åã®ããã«äºç´ããã¦ãã¾ããããã¦callback(err)ãå¼ã°ãã¾ãã- 2ã¤ç®ã®å¼æ°(ã¨å¿
è¦ã«å¿ãã¦ä»¥éã®å¼æ°)ã¯æ£å¸¸ãªçµæãå¾ãããã®ãã®ã§ã
callback(null, result1, result2â¦)ãå¼ã°ãã¾ãã
ãªã®ã§ãåä¸ã® callback 颿°ã¯ãã¨ã©ã¼å ±åã¨çµææ¸¡ã両æ¹ã®ããã«ä½¿ããã¾ãã
ç ´æ» ã®ãã©ããã
ä¸è¦ããã¨ãããã¯éåæã³ã¼ãã£ã³ã°ã®å®è¡å¯è½ãªæ¹æ³ã§ãã確ãã«ãã®éãã§ãã1ã¤ã¾ãã¯2ã¤ç¨åº¦ã®ãã¹ããããå¼ã³åºãã®å ´åã«ã¯åé¡ãªãè¦ãã¾ãã
ããããæ¬¡ã ã«ç¶ãè¤æ°ã®éåæã¢ã¯ã·ã§ã³ã®å ´åãæ¬¡ã®ãããªã³ã¼ããæã¤ãã¨ã«ãªãã¾ã:
loadScript('1.js', function(error, script) {
if (error) {
handleError(error);
} else {
// ...
loadScript('2.js', function(error, script) {
if (error) {
handleError(error);
} else {
// ...
loadScript('3.js', function(error, script) {
if (error) {
handleError(error);
} else {
// ...ãã¹ã¦ã®ã¹ã¯ãªãããèªã¿è¾¼ã¾ããã¾ã§ç¶ã (*)
}
});
}
})
}
});
ä¸è¨ã®ã³ã¼ãã§ã¯:
1.jsããã¼ãããã¨ã©ã¼ããªããã°2.jsããã¼ããã¾ããã¨ã©ã¼ããªããã°3.jsããã¼ããã¾ããã¨ã©ã¼ããªããã° â ä»ã®ä½ã(*)ãè¡ãã¾ãã
å¼ã³åºãããããã¹ããããã«ã¤ãã¦ãç¹ã« ... ã§ã¯ãªããå®éã«ããå¤ãã®ã«ã¼ããæ¡ä»¶å¼ãªã©ãå«ãã³ã¼ããããå ´åãã³ã¼ãã¯ããæ·±ããªããçã
管çãé£ãããªãã¾ãã
ãã㯠âã³ã¼ã«ããã¯å°çâ ã âç ´æ» ã®ãã©ãããâ ã¨å¼ã°ãã¾ãã
ãã¹ããããå¼ã³åºãã® âãã©ãããâ ã¯ãã¹ã¦ã®éåæã¢ã¯ã·ã§ã³ã§å³ã«ä¼¸ã³ã¦ããã¾ããããã«ãããã¯å¶å¾¡ä¸è½ã«ãªãã¾ãã
ãããã£ã¦ããã®ã³ã¼ãã£ã³ã°æ¹æ³ã¯ãã¾ãè¯ãããã¾ããã
ç§ãã¡ã¯ã次ã®ããã«ãã¹ã¦ã®ã¢ã¯ã·ã§ã³ãã¹ã¿ã³ãã¢ãã³ã®é¢æ°ã«ãããã¨ã§ããã®åé¡ã軽æ¸ãããã¨ãã§ãã¾ãã:
loadScript('1.js', step1);
function step1(error, script) {
if (error) {
handleError(error);
} else {
// ...
loadScript('2.js', step2);
}
}
function step2(error, script) {
if (error) {
handleError(error);
} else {
// ...
loadScript('3.js', step3);
}
}
function step3(error, script) {
if (error) {
handleError(error);
} else {
// ...ãã¹ã¦ã®ã¹ã¯ãªãããèªã¿è¾¼ã¾ããå¾ã«ç¶ã (*)
}
};
ã©ãã§ãããï¼ åããã¨ããã¾ãããä»ãæ·±ããã¹ãã¯ããã¾ããããªããªããã¹ã¦ã®ã¢ã¯ã·ã§ã³ããããã¬ãã«ã®é¢æ°ã«åé¢ããããã§ãã
ããã¯æ©è½ãã¾ãããã³ã¼ãã¯ã°ãã°ãã«ãªã£ãã¹ãã¬ããã·ã¼ãã®ããã«è¦ãã¾ããããã¯èªã¿ã«ãããããã¦ããããæ°ã¥ããã§ãããã1ã¤ã¯ãèªãã«ã¯é¢æ°éã§è¦ç¹ã®ã¸ã£ã³ããå¿ è¦ã§ããããã¯ä¸ä¾¿ã§ãèªè ãã³ã¼ãã«ç²¾éãã¦ããããã©ãã«è¦ç¹ãç§»åãããããããåãããªãå ´åã¯ç¹ã«å°ãã¾ãã
ã¾ããstep* ã¨ããååã®é¢æ°ã¯ãã¹ã¦1度ããã®ä½¿ç¨ã§ãããâç ´æ»
ã®ãã©ãããâ ãé¿ããããã ãã«ä½ããã¦ãã¾ããã¢ã¯ã·ã§ã³ãã§ã¼ã³ãã§ã¼ã³ã®å¤ã§ããããåå©ç¨ããã¤ããã¯ããã¾ããããã®ãããåå空éãå°ãä¹±éã§ãã
ããè¯ããã®ãå¿ è¦ã§ãã
幸ãã«ãããã®ãããªãã©ããããåé¿ããä»ã®æ¹æ³ãããã¾ãããã¹ããªæ¹æ³ã®1ã¤ã¯æ¬¡ã®ç« ã§èª¬æãã âpromiseâ ã使ããã¨ã§ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã