Baseline Widely available
Promise()
æé 彿°å建 Promise
对象ãå®ä¸»è¦ç¨äºå°è£
å°æªæ¯æ Promise çåºäºåè°ç APIã
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("foo");
}, 300);
});
promise1.then((value) => {
console.log(value);
// Expected output: "foo"
});
console.log(promise1);
// Expected output: [object Promise]
è¯æ³
夿³¨ï¼ Promise()
åªè½éè¿ new
è¿ç®ç¬¦æ¥æé ã妿å°è¯å¨æ²¡æä½¿ç¨ new
çæ
åµä¸è°ç¨å®ï¼ä¼æåº TypeError
å¼å¸¸ã
executor
卿é 彿°ä¸æ§è¡ç function
ã宿¥æ¶ä¸¤ä¸ªå½æ°ä½ä¸ºåæ°ï¼resolveFunc
å rejectFunc
ãexecutor
䏿åºçä»»ä½é误é½ä¼å¯¼è´ Promise 被æç»ï¼å¹¶ä¸è¿åå¼å°è¢«å¿½ç¥ãexecutor
çè¯ä¹å°å¨ä¸æè¯¦ç»ä»ç»ã
å½éè¿ new
å
³é®åè°ç¨ Promise
æé 彿°æ¶ï¼å®ä¼è¿åä¸ä¸ª Promise 对象ãå½ resolveFunc
æè
rejectFunc
被è°ç¨æ¶ï¼è¯¥ Promise 对象就ä¼å为已解å³ï¼resolvedï¼ã请注æï¼å¦æä½ è°ç¨ resolveFunc
æ rejectFunc
å¹¶ä¼ å
¥å¦ä¸ä¸ª Promise 对象ä½ä¸ºåæ°ï¼å¯ä»¥è¯´è¯¥ Promise 对象â已解å³âï¼ä½ä»æªâæ²å®ï¼settledï¼âãæå
³æ´å¤è§£éï¼è¯·åé
Promise æè¿°ã
ä¼ ç»ä¸ï¼å¨ Promise åºç°ä¹åï¼ï¼è®¾è®¡ä¸å¼æ¥ä»»å¡åºäºåè°å½æ°å®ç°ã
readFile("./data.txt", (error, result) => {
// è¿ä¸ªåè°å½æ°å°å¨ä»»å¡å®æå被è°ç¨ï¼è¿åæç»ç `error` æ `result`ã
// ä»»ä½ä¾èµäºè¿åç»æçæä½é½å¿
é¡»å¨è¿ä¸ªåè°å½æ°å
å®ä¹ã
});
// `readFile` 请æ±è¢«ååºåï¼æ¤å¤ç代ç ä¼ç«å³æ§è¡ã
// å®ä¸ä¼çå¾
åè°å½æ°è¢«è°ç¨ï¼å æ¤ä½¿ `readFile` æä¸ºäºâ弿¥âçã
为äºå©ç¨ Promise æä¾çæ´å¥½çå¯è¯»æ§åè¯è¨ç¹æ§ï¼Promise()
æé 彿°å
许å°åºäºåè°ç API 转æ¢ä¸ºåºäº Promise ç APIã
夿³¨ï¼ å¦æä½ çä»»å¡å·²ç»åºäº Promise å®ç°ï¼ä½ 大æ¦çä¸éè¦ä½¿ç¨ Promise()
æé 彿°ã
executor
æ¯å°åè°å½æ°çç»æä¸ Promise å
³èå¨ä¸èµ·çèªå®ä¹ä»£ç ãç¼å executor
çå·¥ä½ç±ç¨åºå宿ãå®ç彿°ç¾ååºè¯¥æ¯ï¼
function executor(resolveFunc, rejectFunc) {
// é常ï¼`executor` 彿°ç¨äºå°è£
æäºæ¥ååè°å½æ°ä½ä¸ºåæ°ç弿¥æä½ï¼æ¯å¦ä¸é¢ç `readFile` 彿°
}
resolveFunc
å rejectFunc
乿¯å½æ°ï¼ä½ å¯ä»¥ç»å®ä»¬ä»»ä½å®é
çåç§°ãå®ä»¬ç彿°ç¾åå¾ç®åï¼å®ä»¬æ¥åä¸ä¸ªä»»æç±»åçåæ°ã
resolveFunc(value); // è§£å³æ¶è°ç¨
rejectFunc(reason); // æç»æ¶è°ç¨
ä¼ å
¥ resolveFunc
ç value
åæ°å¯ä»¥æ¯å¦ä¸ä¸ª Promise 对象ï¼å¨è¿ç§æ
åµä¸ï¼æ°æé ç Promise 对象çç¶æå°âéå®âå°ä¼ å
¥ç Promise 对象ï¼ä½ä¸º resolution Promise çä¸é¨åï¼ãrejectFunc
çè¯ä¹ç±»ä¼¼äº throw
è¯å¥ï¼å æ¤ reason
é常æ¯ä¸ä¸ª Error
å®ä¾ã妿 value
æ reason
䏿任æä¸ä¸ªè¢«çç¥ï¼Promise å°ä¼è¢«å
ç°ï¼fulfilledï¼ææç»ï¼rejectedï¼ä¸º undefined
ã
executor
çå®æç¶æå¯¹ Promise çç¶æå½±åæéï¼
executor
彿°çè¿åå¼ä¼è¢«å¿½ç¥ãexecutor
彿°ä¸ç return
è¯å¥ä»
影忧嶿µç¨ï¼è°æ´å½æ°æä¸ªé¨åæ¯å¦æ§è¡ï¼ä½ä¸ä¼å½±å Promise çå
ç°å¼ã妿 executor
彿°éåºï¼ä¸æªæ¥ä¸å¯è½è°ç¨ resolveFunc
æ rejectFunc
ï¼ä¾å¦ï¼æ²¡æå®æå¼æ¥ä»»å¡ï¼ï¼é£ä¹ Promise å°æ°¸è¿ä¿æå¾
å®ç¶æãexecutor
彿°ä¸æåºé误ï¼å Promise å°è¢«æç»ï¼é¤é resolveFunc
æ rejectFunc
å·²ç»è¢«è°ç¨ã夿³¨ï¼ å¾ å®ç Promise çåå¨å¹¶ä¸ä¼é»æ¢ç¨åºéåºã妿äºä»¶å¾ªç¯ä¸ºç©ºï¼åç¨åºä¼éåºï¼å°½ç®¡åå¨å¾ å®ç Promiseï¼å 为å®ä»¬å¿ ç¶æ°¸è¿å¤äºå¾ å®ç¶æï¼ã
以䏿¯å ¸åç Promise æµç¨æ¦è¿°ï¼
Promise
对象æ¶ï¼å®è¿ä¼çæä¸å¯¹ç¸åºç resolveFunc
å rejectFunc
彿°ï¼å®ä»¬ä¸ Promise
对象âç»å®âå¨ä¸èµ·ãexecutor
é常ä¼å°è£
æäºæä¾åºäºåè°ç API ç弿¥æä½ãåè°å½æ°ï¼ä¼ ç»åå§åè° API ç彿°ï¼å¨ executor
代ç ä¸å®ä¹ï¼å æ¤å®å¯ä»¥è®¿é® resolveFunc
å rejectFunc
ãexecutor
æ¯åæ¥è°ç¨çï¼å¨æé Promise
æ¶ç«å³è°ç¨ï¼ï¼å¹¶å° resolveFunc
å rejectFunc
彿°ä½ä¸ºä¼ å
¥åæ°ãexecutor
ä¸çä»£ç ææºä¼æ§è¡æäºæä½ã弿¥ä»»å¡çæç»å®æéè¿ resolveFunc
æ rejectFunc
å¼èµ·çå¯ä½ç¨ä¸ Promise å®ä¾è¿è¡éä¿¡ãè¿ä¸ªå¯ä½ç¨è®© Promise
对象å为â已解å³âç¶æã
resolveFunc
ï¼åä¼ å
¥çå¼å°è§£å³ãPromise å¯è½ä¼ä¿æå¾
å®ç¶æï¼å¦æä¼ å
¥äºå¦ä¸ä¸ª thenable 对象ï¼ï¼å为已å
ç°ç¶æï¼å¨ä¼ å
¥é thenable å¼ç大夿°æ
åµä¸ï¼ï¼æè
å为已æç»ç¶æï¼å¨è§£æå¼æ æçæ
åµä¸ï¼ãrejectFunc
ï¼å Promise ç«å³å为已æç»ç¶æãresolveFunc
æ rejectFunc
ä¸çä¸ä¸ªè¢«è°ç¨ï¼Promise å°ä¿æè§£å³ç¶æãåªæç¬¬ä¸æ¬¡è°ç¨ resolveFunc
æ rejectFunc
ä¼å½±å Promise çæç»ç¶æï¼éå对任ä¸å½æ°çè°ç¨é½ä¸è½æ´æ¹å
ç°å¼ææç»åå ï¼ä¹ä¸è½å°å
¶æç»ç¶æä»âå·²å
ç°â转æ¢ä¸ºâå·²æç»âæç¸åãexecutor
æåºé误ï¼å Promise 被æç»ã使¯ï¼å¦æ resolveFunc æ rejectFunc ä¸çä¸ä¸ªå·²ç»è¢«è°ç¨ï¼å æ¤ Promise å·²ç»è¢«è§£å³ï¼ï¼å忽ç¥è¯¥é误ãthen()
ãcatch()
æ finally()
å
³èçè¿ä¸æ¥å¤çç¨åºãæç»çå
ç°å¼ææç»åå å¨è°ç¨æ¶ä½ä¸ºè¾å
¥åæ°ä¼ ç»å
ç°åæç»å¤çç¨åºï¼è¯·åé
promise çé¾å¼è°ç¨ï¼ãä¾å¦ï¼ä¸é¢çåºäºåè°ç readFile
API å¯ä»¥è½¬æ¢ä¸ºåºäº Promise ç APIã
const readFilePromise = (path) =>
new Promise((resolve, reject) => {
readFile(path, (error, result) => {
if (error) {
reject(error);
} else {
resolve(result);
}
});
});
readFilePromise("./data.txt")
.then((result) => console.log(result))
.catch((error) => console.error("读åæä»¶å¤±è´¥"));
resolve
å reject
åè°ä»
å¨ executor
彿°çä½ç¨åå
å¯ç¨ï¼è¿æå³ç卿é promise ä¹åæ æ³è®¿é®å®ä»¬ãå¦æä½ æ³å¨å³å®å¦ä½è§£å³ä¹åå
æé promiseï¼å¯ä»¥ä½¿ç¨ Promise.withResolvers()
æ¹æ³ï¼è¯¥æ¹æ³æ´é²äº resolve
and reject
彿°ã
resolve
彿°æä»¥ä¸è¡ä¸ºï¼
Promise
对象æ¬èº«ï¼å³å®æâç»å®âç Promise 对象ï¼ï¼å Promise
对象ä¼è¢«æç»å¹¶æåºä¸ä¸ª TypeError
é误ãthen
屿§æ then
屿§ä¸å¯è°ç¨ç对象ï¼ï¼å该 Promise 对象ä¼è¢«ç«å³ä»¥è¯¥å¼å
ç°ãPromise
å®ä¾ï¼ï¼å该 thenable 对象ç then
æ¹æ³å°è¢«ä¿å并卿ªæ¥è¢«è°ç¨ï¼å®æ»æ¯å¼æ¥è°ç¨ï¼ãthen
æ¹æ³å°è¢«è°ç¨å¹¶ä¼ å
¥ä¸¤ä¸ªåè°å½æ°ï¼è¿ä¸¤ä¸ªå½æ°çè¡ä¸ºä¸ä¼ éç» executor
彿°ç resolveFunc
å rejectFunc
彿°å®å
¨ç¸åã妿è°ç¨ then
æ¹æ³æ¶åºç°é误ï¼åå½åç Promise
对象ä¼è¢«æç»å¹¶æåºè¿ä¸ªé误ã卿åä¸ç§æ åµä¸ï¼è¿æå³çåä¸é¢è¿æ ·ç代ç ï¼
new Promise((resolve, reject) => {
resolve(thenable);
});
大è´ç¸å½äºï¼
new Promise((resolve, reject) => {
try {
thenable.then(
(value) => resolve(value),
(reason) => reject(reason),
);
} catch (e) {
reject(e);
}
});
使¯å¨ resolve(thenable)
çæ
åµä¸ï¼æå¦ä¸åºå«ï¼
resolve
彿°æ¯åæ¥è°ç¨çï¼å æ¤å次è°ç¨ resolve
æ reject
彿°æ²¡æä»»ä½å½±åï¼å³ä½¿éè¿ anotherPromise.then()
ç»å®çå¤çç¨åºå°æªè¢«è°ç¨ãthen
æ¹æ³æ¯å¼æ¥è°ç¨çï¼å æ¤å¦æä¼ å
¥ thenable 对象ï¼å该 Promise
对象ä¸ä¼è¢«ç«å³è§£å³ãå 为 resolve
彿°å次è°ç¨æ¶ä½¿ç¨ thenable.then()
ä¼ éç»å®çä»»ä½å¼ä½ä¸º value
åæ°ï¼æä»¥è§£å³å½æ°è½å¤å±å¼åµå¥ç thenable 对象ï¼å
¶ä¸ä¸ä¸ª thenable 对象è°ç¨å
¶ onFulfilled
å¤çç¨åºå¹¶è¿åå¦ä¸ä¸ª thenable 对象ãè¿æ ·åçæææ¯ï¼çå®ç Promise
对象çå
ç°å¤ç卿°¸è¿ä¸ä¼æ¥æ¶å° thenable 对象ä½ä¸ºå
¶å
ç°å¼ã
为äºè®©ä¸ä¸ªå½æ°å
·æ Promise åè½ï¼å¯ä»¥å¨éå½çæ¶åè°ç¨ resolve
å reject
彿°ï¼å¹¶è¿åä¸ä¸ª Promise 对象ã
function myAsyncFunction(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
}
è°ç¨ resolveFunc çææ
è°ç¨ resolveFunc
彿°ä¼ä½¿ Promise 对象å为已解å³ç¶æï¼å æ¤å次è°ç¨ resolveFunc
æ rejectFunc
彿°æ²¡æä»»ä½ææãç¶èï¼Promise 对象å¯è½å¤äºä»¥ä¸ä»»ä½ç¶æä¹ä¸ï¼å¾
å®ãå·²å
ç°æå·²æç»ã
å¨ä¸é¢è¿ä¸ªä¾åä¸ï¼pendingResolved
Promise 对象å¨å建æ¶å°±å·²ç»è¢«è§£å³ï¼å 为å®å·²ç»âéå®â以å¹é
å
é¨ Promise 对象çæç»ç¶æï¼åç»å¨ executor 彿°ä¸è°ç¨ resolveOuter
æ rejectOuter
ææåºé误对å
¶æç»ç¶ææ²¡æå½±åãç¶èï¼å
é¨ Promise 对象ä»ç¶å¤äºå¾
å®ç¶æï¼ç´å° 100 毫ç§åæè¢«è§£å³ï¼å æ¤å¤é¨ Promise 对象ä¹å¤äºå¾
å®ç¶æï¼
const pendingResolved = new Promise((resolveOuter, rejectOuter) => {
resolveOuter(
new Promise((resolveInner) => {
setTimeout(() => {
resolveInner("å
é¨");
}, 100);
}),
);
});
fulfilledResolved
Promise 对象å¨è¢«è§£å³æ¶ç«å³å为已å
ç°ç¶æï¼å 为å®ä»¥é thenable å¼è§£å³ãç¶èï¼å¨å®è¢«å建æ¶ï¼å®æ¯æªè§£å³çï¼å 为 resolve
æ reject
彿°è¿æ²¡æè¢«è°ç¨ãæªè§£å³ç Promise 对象å¿
ç¶æ¯å¾
å®ç¶æï¼
const fulfilledResolved = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("å¤é¨");
}, 100);
});
æ¾ç¶ï¼è°ç¨ rejectFunc
彿°ä¼å¯¼è´ Promise 对象被æç»ãç¶èï¼å³ä½¿å¨è°ç¨ resolveFunc
åè°å½æ°æ¶ï¼ä¹æä¸¤ç§æ¹æ³å¯ä»¥ä½¿ Promise 对象ç«å³è¢«æç»ã
// 1. ä¼ å
¥ Promise æ¬èº«
const rejectedResolved1 = new Promise((resolve) => {
// 注æï¼resolve å¿
须弿¥è°ç¨ï¼ä»¥ä¾¿åå§å rejectedResolved1 åé
setTimeout(() => resolve(rejectedResolved1)); // TypeError: Chaining cycle detected for promise #<Promise>
});
// 2. ä¼ å
¥ä¸ä¸ªå¨è®¿é® `then` 屿§æ¶æåºå¼å¸¸ç对象
const rejectedResolved2 = new Promise((resolve) => {
resolve({
get then() {
throw new Error("æ æ³è®¿é® then 屿§");
},
});
});
è§è æµè§å¨å
¼å®¹æ§ åè§
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