ä¸ºäºæ¼ç¤ºåè°ãpromise åå ¶ä»æ½è±¡æ¦å¿µç使ç¨ï¼æä»¬å°ä½¿ç¨ä¸äºæµè§å¨æ¹æ³ï¼å ·ä½å°è¯´ï¼æ¯å è½½èæ¬åæ§è¡ç®åçææ¡£æä½çæ¹æ³ã
å¦æä½ ä¸çæè¿äºæ¹æ³ï¼å¹¶ä¸å¯¹å®ä»¬å¨è¿äºç¤ºä¾ä¸çç¨æ³æå°çæï¼é£ä¹ä½ å¯è½éè¦é è¯»æ¬æç¨ ä¸ä¸é¨å ä¸çå ç« ã
使¯ï¼æä»¬ä¼å°½å ¨å使讲解å徿´å æ¸ æ°ãå¨è¿å¿ä¸ä¼ææµè§å¨æ¹é¢ççæ£å¤æçä¸è¥¿ã
JavaScript 主æºï¼hostï¼ç¯å¢æä¾äºè®¸å¤å½æ°ï¼è¿äºå½æ°å 许æä»¬è®¡å 弿¥ è¡ä¸ºï¼actionï¼ââ ä¹å°±æ¯å¨æä»¬æ§è¡ä¸æ®µæ¶é´åæèªè¡å®æçè¡ä¸ºã
ä¾å¦ï¼setTimeout 彿°å°±æ¯ä¸ä¸ªè¿æ ·ç彿°ã
è¿å¿æä¸äºå®é ä¸ç弿¥è¡ä¸ºç示ä¾ï¼ä¾å¦å è½½èæ¬åæ¨¡åï¼æä»¬å°å¨åé¢çç« èä¸ä»ç»ï¼ã
让æä»¬çä¸ä¸å½æ° loadScript(src)ï¼è¯¥å½æ°ä½¿ç¨ç»å®ç 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 彿°å¹¶æ²¡ææä¾è·è¸ªå è½½å®æçæ¹æ³ãèæ¬å 载并æç»è¿è¡ï¼ä»
æ¤èå·²ã使们叿äºè§£èæ¬ä½æ¶å è½½å®æï¼ä»¥ä½¿ç¨å
¶ä¸çæ°å½æ°ååéã
让æä»¬æ·»å ä¸ä¸ª callback 彿°ä½ä¸º loadScript ç第äºä¸ªåæ°ï¼è¯¥å½æ°åºå¨èæ¬å è½½å®ææ¶æ§è¡ï¼
function loadScript(src, callback) {
let script = document.createElement('script');
script.src = src;
script.onload = () => callback(script);
document.head.append(script);
}
onload äºä»¶å¨ èµæºå è½½ï¼onloadï¼onerror 䏿䏿æè¿°ï¼å®é常ä¼å¨èæ¬å è½½åæ§è¡å®æåæ§è¡ä¸ä¸ªå½æ°ã
ç°å¨ï¼å¦ææä»¬æ³è°ç¨è¯¥èæ¬ä¸çæ°å½æ°ï¼æä»¬åºè¯¥å°å ¶åå¨åè°å½æ°ä¸ï¼
loadScript('/my/script.js', function() {
// å¨èæ¬å è½½å®æåï¼åè°å½æ°æä¼æ§è¡
newFunction(); // ç°å¨å®å·¥ä½äº
...
});
è¿æ¯æä»¬çæ³æ³ï¼ç¬¬äºä¸ªåæ°æ¯ä¸ä¸ªå½æ°ï¼é常æ¯å¿å彿°ï¼ï¼è¯¥å½æ°ä¼å¨è¡ä¸ºï¼actionï¼å®ææ¶è¿è¡ã
è¿æ¯ä¸ä¸ªå¸¦æçå®èæ¬çå¯è¿è¡ç示ä¾ï¼
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(`é
·ï¼èæ¬ ${script.src} å è½½å®æ`);
alert( _ ); // _ æ¯æå è½½çèæ¬ä¸å£°æçä¸ä¸ªå½æ°
});
è¿è¢«ç§°ä¸ºâåºäºåè°âç弿¥ç¼ç¨é£æ ¼ã弿¥æ§è¡æé¡¹åè½ç彿°åºè¯¥æä¾ä¸ä¸ª callback åæ°ç¨äºå¨ç¸åºäºä»¶å®ææ¶è°ç¨ãï¼è¯æ³¨ï¼ä¸é¢è¿ä¸ªä¾åä¸çç¸åºäºä»¶æ¯æèæ¬å è½½ï¼
è¿éæä»¬å¨ loadScript ä¸å°±æ¯è¿ä¹åçï¼ä½å½ç¶è¿æ¯ä¸ç§éç¨æ¹æ³ã
å¨åè°ä¸åè°
æä»¬å¦ä½ä¾æ¬¡å è½½ä¸¤ä¸ªèæ¬ï¼ç¬¬ä¸ä¸ªï¼ç¶åæ¯ç¬¬äºä¸ªï¼
èªç¶çè§£å³æ¹æ¡æ¯å°ç¬¬äºä¸ª loadScript è°ç¨æ¾å
¥åè°ä¸ï¼å¦ä¸æç¤ºï¼
loadScript('/my/script.js', function(script) {
alert(`é
·ï¼èæ¬ ${script.src} å è½½å®æï¼è®©æä»¬ç»§ç»å è½½å¦ä¸ä¸ªå§`);
loadScript('/my/script2.js', function(script) {
alert(`é
·ï¼ç¬¬äºä¸ªèæ¬å è½½å®æ`);
});
});
å¨å¤é¨ loadScript æ§è¡å®ææ¶ï¼åè°å°±ä¼åèµ·å
é¨ç loadScriptã
妿æä»¬è¿æ³è¦ä¸ä¸ªèæ¬å¢ï¼
loadScript('/my/script.js', function(script) {
loadScript('/my/script2.js', function(script) {
loadScript('/my/script3.js', function(script) {
// ...å è½½å®ææèæ¬åç»§ç»
});
});
});
å æ¤ï¼æ¯ä¸ä¸ªæ°è¡ä¸ºï¼actionï¼é½å¨åè°å é¨ãè¿å¯¹äºå 个è¡ä¸ºæ¥è¯´è¿å¥½ï¼ä½å¯¹äºè®¸å¤è¡ä¸ºæ¥è¯´å°±ä¸å¥½äºï¼æä»¥æä»¬å¾å¿«å°±ä¼çå°å ¶ä»åä½ã
å¤ç Error
å¨ä¸è¿°ç¤ºä¾ä¸ï¼æä»¬å¹¶æ²¡æèèåºç° error çæ åµãå¦æèæ¬å 载失败æä¹åï¼æä»¬çåè°åºè¯¥è½å¤å¯¹æ¤ä½åºååºã
è¿æ¯ 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) {
// å¤ç error
} else {
// èæ¬å è½½æå
}
});
忬¡å¼ºè°ï¼æä»¬å¨ loadScript ä¸æä½¿ç¨çæ¹æ¡å
¶å®å¾æ®éãå®è¢«ç§°ä¸ºâError ä¼å
åè°ï¼error-first callbackï¼â飿 ¼ã
çº¦å®æ¯ï¼
callbackç第ä¸ä¸ªåæ°æ¯ä¸º error èä¿ççã䏿¦åºç° errorï¼callback(err)å°±ä¼è¢«è°ç¨ã- 第äºä¸ªåæ°ï¼åä¸ä¸ä¸ªåæ°ï¼å¦æéè¦çè¯ï¼ç¨äºæåçç»æãæ¤æ¶
callback(null, result1, result2â¦)å°±ä¼è¢«è°ç¨ã
å æ¤ï¼åä¸ç callback 彿°å¯ä»¥åæ¶å
·ææ¥å error åä¼ éè¿åç»æçä½ç¨ã
åè¿éåå¡
ä¹ä¸çï¼å®åæ¯ä¸ç§å¯è¡ç弿¥ç¼ç¨æ¹å¼ãçç¡®å¦æ¤ï¼å¯¹äºä¸ä¸ªæä¸¤ä¸ªåµå¥çè°ç¨çèµ·æ¥è¿ä¸éã
ä½å¯¹äºä¸ä¸ªæ¥ä¸ä¸ªçå¤ä¸ªå¼æ¥è¡ä¸ºï¼ä»£ç å°ä¼åæè¿æ ·ï¼
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 {
// ...å è½½å®ææèæ¬åç»§ç» (*)
}
}
çå°äºåï¼å®çä½ç¨ç¸åï¼ä½æ¯æ²¡ææ·±å±çåµå¥äºï¼å 为æä»¬å°æ¯ä¸ªè¡ä¸ºé½ç¼åæäºä¸ä¸ªç¬ç«çé¡¶å±å½æ°ã
å®å¯ä»¥å·¥ä½ï¼ä½æ¯ä»£ç çèµ·æ¥å°±åæ¯ä¸ä¸ªè¢«æè£çè¡¨æ ¼ãä½ å¯è½å·²ç»æ³¨æå°äºï¼å®çå¯è¯»æ§å¾å·®ï¼å¨é 读æ¶ä½ éè¦å¨å个代ç åä¹é´è·³è½¬ãè¿å¾ä¸æ¹ä¾¿ï¼ç¹å«æ¯å¦æè¯»è 对代ç ä¸çæï¼ä»ä»¬çè³ä¸ç¥éåºè¯¥è·³è½¬å°ä»ä¹å°æ¹ã
æ¤å¤ï¼å为 step* ç彿°é½æ¯ä¸æ¬¡æ§ä½¿ç¨çï¼å建å®ä»¬å°±æ¯ä¸ºäºé¿å
âåè¿éåå¡âãæ²¡æäººä¼å¨è¡ä¸ºé¾ä¹å¤éç¨å®ä»¬ãå æ¤ï¼è¿éçå½åç©ºé´æç¹æ··ä¹±ã
æä»¬å¸æè¿ææ´å¥½çæ¹æ³ã
幸è¿çæ¯ï¼æå ¶ä»æ¹æ³å¯ä»¥é¿å æ¤ç±»éåå¡ãæå¥½çæ¹æ³ä¹ä¸å°±æ¯ âpromiseâï¼æä»¬å°å¨ä¸ä¸ç« ä¸ä»ç»å®ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼