promise çå¤çç¨åº .thenã.catch å .finally 齿¯å¼æ¥çã
å³ä¾¿ä¸ä¸ª promise ç«å³è¢« resolveï¼.thenã.catch å .finally ä¸é¢ ç代ç ä¹ä¼å¨è¿äºå¤çç¨åºä¹å被æ§è¡ã
示ä¾ä»£ç å¦ä¸ï¼
let promise = Promise.resolve();
promise.then(() => alert("promise done!"));
alert("code finished"); // è¿ä¸ª alert å
æ¾ç¤º
å¦æä½ è¿è¡å®ï¼ä½ ä¼é¦å
çå° code finishedï¼ç¶åææ¯ promise doneã
è¿å¾å¥æªï¼å 为è¿ä¸ª promise è¯å®æ¯ä¸å¼å§å°±å®æçã
为ä»ä¹ .then ä¼å¨ä¹åæè¢«è§¦åï¼è¿æ¯æä¹åäºï¼
微任å¡éåï¼Microtask queueï¼
弿¥ä»»å¡éè¦éå½ç管çã为æ¤ï¼ECMA æ åè§å®äºä¸ä¸ªå
é¨éå PromiseJobsï¼é常被称为â微任å¡éåï¼microtask queueï¼âï¼V8 æ¯è¯ï¼ã
å¦ è§è ä¸æè¿°ï¼
- éåï¼queueï¼æ¯å è¿å åºçï¼é¦å è¿å ¥éåçä»»å¡ä¼é¦å è¿è¡ã
- åªæå¨ JavaScript 弿䏿²¡æå ¶å®ä»»å¡å¨è¿è¡æ¶ï¼æå¼å§æ§è¡ä»»å¡éåä¸çä»»å¡ã
æè
ï¼ç®åå°è¯´ï¼å½ä¸ä¸ª promise åå¤å°±ç»ªæ¶ï¼å®ç .then/catch/finally å¤çç¨åºå°±ä¼è¢«æ¾å
¥éåä¸ï¼ä½æ¯å®ä»¬ä¸ä¼ç«å³è¢«æ§è¡ãå½ JavaScript 弿æ§è¡å®å½åç代ç ï¼å®ä¼ä»éåä¸è·åä»»å¡å¹¶æ§è¡å®ã
è¿å°±æ¯ä¸ºä»ä¹å¨ä¸é¢é£ä¸ªç¤ºä¾ä¸ âcode finishedâ ä¼å æ¾ç¤ºã
promise çå¤çç¨åºæ»æ¯ä¼ç»è¿è¿ä¸ªå é¨éåã
妿æä¸ä¸ªå
å«å¤ä¸ª .then/catch/finally çé¾ï¼é£ä¹å®ä»¬ä¸çæ¯ä¸ä¸ªé½æ¯å¼æ¥æ§è¡çãä¹å°±æ¯è¯´ï¼å®ä¼é¦å
è¿å
¥éåï¼ç¶åå¨å½åä»£ç æ§è¡å®æå¹¶ä¸å
åæéçå¤çç¨åºé½å®ææ¶æä¼è¢«æ§è¡ã
妿æ§è¡é¡ºåºå¯¹æä»¬å¾éè¦è¯¥æä¹åï¼æä»¬æä¹æè½è®© code finished å¨ promise done ä¹ååºç°å¢ï¼
å¾ç®åï¼åªéè¦åä¸é¢è¿æ ·ä½¿ç¨ .then å°å
¶æ¾å
¥éåï¼
Promise.resolve()
.then(() => alert("promise done!"))
.then(() => alert("code finished"));
ç°å¨ä»£ç å°±æ¯æç §é¢ææ§è¡çã
æªå¤çç rejection
è¿è®°å¾ ä½¿ç¨ promise è¿è¡é误å¤ç ä¸ç« ä¸ç unhandledrejection äºä»¶åï¼
ç°å¨ï¼æä»¬å¯ä»¥ç¡®åå°çå° JavaScript æ¯å¦ä½åç°æªå¤çç rejection çã
妿ä¸ä¸ª promise ç error æªè¢«å¨å¾®ä»»å¡éåçæ«å°¾è¿è¡å¤çï¼åä¼åºç°âæªå¤çç rejectionâã
æ£å¸¸æ¥è¯´ï¼å¦ææä»¬é¢æå¯è½ä¼åçéè¯¯ï¼æä»¬ä¼å¨ promise é¾ä¸æ·»å .catch æ¥å¤ç errorï¼
let promise = Promise.reject(new Error("Promise Failed!"));
promise.catch(err => alert('caught'));
// ä¸ä¼è¿è¡ï¼error å·²ç»è¢«å¤ç
window.addEventListener('unhandledrejection', event => alert(event.reason));
使¯å¦ææä»¬å¿è®°æ·»å .catchï¼é£ä¹ï¼å¾®ä»»å¡é忏
空åï¼JavaScript 弿ä¼è§¦åä¸é¢è¿äºä»¶ï¼
let promise = Promise.reject(new Error("Promise Failed!"));
// Promise Failed!
window.addEventListener('unhandledrejection', event => alert(event.reason));
妿æä»¬è¿ä¸ç¹åå¤çè¿ä¸ª error ä¼ææ ·ï¼ä¾å¦ï¼
let promise = Promise.reject(new Error("Promise Failed!"));
setTimeout(() => promise.catch(err => alert('caught')), 1000);
// Error: Promise Failed!
window.addEventListener('unhandledrejection', event => alert(event.reason));
ç°å¨ï¼å¦ææä»¬è¿è¡ä¸é¢è¿æ®µä»£ç ï¼æä»¬ä¼å
çå° Promise Failed!ï¼ç¶åææ¯ caughtã
妿æä»¬å¹¶ä¸äºè§£å¾®ä»»å¡éåï¼æä»¬å¯è½ä¼æ³ï¼â为ä»ä¹ unhandledrejection å¤çç¨åºä¼è¿è¡ï¼æä»¬å·²ç»æè·ï¼catchï¼å¹¶å¤çäº errorï¼â
使¯ç°å¨æä»¬ç¥éäºï¼å½å¾®ä»»å¡éåä¸çä»»å¡é½å®ææ¶ï¼æä¼çæ unhandledrejectionï¼å¼æä¼æ£æ¥ promiseï¼å¦æ promise ä¸çä»»æä¸ä¸ªåºç° ârejectedâ ç¶æï¼unhandledrejection äºä»¶å°±ä¼è¢«è§¦åã
å¨ä¸é¢è¿ä¸ªä¾åä¸ï¼è¢«æ·»å å° setTimeout ä¸ç .catch ä¹ä¼è¢«è§¦åãåªæ¯ä¼å¨ unhandledrejection äºä»¶åºç°ä¹åæä¼è¢«è§¦åï¼æä»¥å®å¹¶æ²¡ææ¹åä»ä¹ï¼æ²¡æåæ¥ä½ç¨ï¼ã
æ»ç»
Promise å¤çå§ç»æ¯å¼æ¥çï¼å ä¸ºææ promise è¡ä¸ºé½ä¼éè¿å é¨ç âpromise jobsâ éåï¼ä¹è¢«ç§°ä¸ºâ微任å¡éåâï¼V8 æ¯è¯ï¼ã
å æ¤ï¼.then/catch/finally å¤çç¨åºæ»æ¯å¨å½å代ç 宿åæä¼è¢«è°ç¨ã
妿æä»¬éè¦ç¡®ä¿ä¸æ®µä»£ç å¨ .then/catch/finally ä¹å被æ§è¡ï¼æä»¬å¯ä»¥å°å®æ·»å å°é¾å¼è°ç¨ç .then ä¸ã
å¨å¤§å¤æ° JavaScript 弿ä¸ï¼å æ¬æµè§å¨å Node.jsï¼ï¼å¾®ä»»å¡ï¼microtaskï¼çæ¦å¿µä¸âäºä»¶å¾ªç¯ï¼event loopï¼âåâå®ä»»å¡ï¼macrotasksï¼âç´§å¯ç¸å ³ãç±äºè¿äºæ¦å¿µè· promise 没æç´æ¥å ³ç³»ï¼æä»¥æä»¬å°å¨æ¬æç¨å¦å¤ä¸é¨åç äºä»¶å¾ªç¯ï¼å¾®ä»»å¡åå®ä»»å¡ ä¸ç« ä¸å¯¹å®ä»¬è¿è¡ä»ç»ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼