Baseline Widely available *
Promise
å¯¹è±¡è¡¨ç¤ºå¼æ¥æä½æç»çå®æï¼æå¤±è´¥ï¼ä»¥åå
¶ç»æå¼ã
è¥æ³äºè§£ promise ç工使¹å¼ä»¥åå¦ä½ä½¿ç¨å®ä»¬ï¼æä»¬å»ºè®®ä½ å é è¯»ä½¿ç¨ Promiseã
æè¿°ä¸ä¸ª Promise
æ¯ä¸ä¸ªä»£çï¼å®ä»£è¡¨ä¸ä¸ªå¨å建 promise æ¶ä¸ä¸å®å·²ç¥çå¼ãå®å
è®¸ä½ å°å¤çç¨åºä¸å¼æ¥æä½çæç»æåå¼æå¤±è´¥åå å
³èèµ·æ¥ãè¿ä½¿å¾å¼æ¥æ¹æ³å¯ä»¥ååæ¥æ¹æ³ä¸æ ·è¿åå¼ï¼å¼æ¥æ¹æ³ä¸ä¼ç«å³è¿åæç»å¼ï¼èæ¯è¿åä¸ä¸ª promiseï¼ä»¥ä¾¿å¨å°æ¥çæä¸ªæ¶é´ç¹æä¾è¯¥å¼ã
ä¸ä¸ª Promise
å¿
ç¶å¤äºä»¥ä¸å ç§ç¶æä¹ä¸ï¼
ä¸ä¸ªå¾
å®ç Promise æç»ç¶æå¯ä»¥æ¯å·²å
ç°å¹¶è¿åä¸ä¸ªå¼ï¼æè
æ¯å·²æç»å¹¶è¿åä¸ä¸ªåå ï¼é误ï¼ãå½å
¶ä¸ä»»æä¸ç§æ
åµåçæ¶ï¼éè¿ Promise ç then
æ¹æ³ä¸²èçå¤çç¨åºå°è¢«è°ç¨ã妿ç»å®ç¸åºå¤çç¨åºæ¶ Promise å·²ç»å
ç°ææç»ï¼è¿å¤çç¨åºå°è¢«ç«å³è°ç¨ï¼å æ¤å¨å¼æ¥æä½å®æåç»å®å¤çç¨åºä¹é´ä¸åå¨ç«ææ¡ä»¶ã
妿ä¸ä¸ª Promise å·²ç»è¢«å ç°ææç»ï¼å³ä¸åå¤äºå¾ å®ç¶æï¼é£ä¹åç§°ä¹ä¸ºå·²æ²å®ï¼settledï¼ã
ä½ è¿ä¼å¬å°ä½¿ç¨å·²è§£å³ï¼resolvedï¼è¿ä¸ªæ¯è¯æ¥æè¿° Promiseââè¿æå³ç该 Promise å·²ç»æ²å®ï¼settledï¼ï¼æä¸ºäºå¹é å¦ä¸ä¸ª Promise çæç»ç¶æè被âéå®ï¼lock-inï¼âï¼è¿ä¸æ¥è§£å³ææç»å®é½æ²¡æå½±åãåå§ Promise ææ¡ä¸ç States and fates ææ¡£å å«äºæ´å¤å ³äº Promise æ¯è¯çç»èãå¨å£è¯ä¸ï¼â已解å³âç Promise é常çä»·äºâå·²å ç°âç Promiseï¼ä½æ¯æ£å¦âStates and fatesâæç¤ºï¼å·²è§£å³ç Promise ä¹å¯ä»¥æ¯å¾ 宿æç»çãä¾å¦ï¼
new Promise((resolveOuter) => {
resolveOuter(
new Promise((resolveInner) => {
setTimeout(resolveInner, 1000);
}),
);
});
æ¤ Promise å¨å建æ¶å·²ç»è¢«è§£å³ï¼å 为 resolveOuter
æ¯åæ¥è°ç¨çï¼ï¼ä½å®æ¯ç¨å¦ä¸ä¸ª Promise è§£å³çï¼å æ¤å¨å
é¨ Promise å
ç°ç 1 ç§ä¹åæä¼è¢«å
ç°ãå¨å®è·µä¸ï¼âè§£å³âè¿ç¨é常æ¯å¨å¹å宿çï¼ä¸å¯è§å¯ï¼åªæå
¶å
ç°ææç»æ¯å¯è§å¯çã
夿³¨ï¼ å
¶ä»å ç§è¯è¨ä¹æä¸äºæºå¶æ¥å®ç°æ°æ§æ±å¼åå»¶è¿è®¡ç®ï¼å®ä»¬ä¹ç§°ä¹ä¸ºâpromiseâï¼ä¾å¦ Schemeãå¨ JavaScript ä¸ï¼Promise 代表已ç»å¨è¿è¡ä¸çè¿ç¨ï¼èä¸å¯ä»¥éè¿åè°å½æ°å®ç°é¾å¼è°ç¨ãå¦æä½ æ³è¦å®ç°æ°æ§æ±å¼ï¼èè使ç¨ä¸å¸¦åæ°ç彿°ï¼ä¾å¦ f = () => expression
æ¥åå»ºæ°æ§æ±å¼è¡¨è¾¾å¼ï¼ç¶åä½¿ç¨ f()
ç«å³æ±å¼ã
Promise
æ¬èº«æ²¡æç¨äºåæ¶çä¸çº§åè®®ï¼ä½ä½ å¯è½å¯ä»¥ç´æ¥åæ¶åºå±ç弿¥æä½ï¼éå¸¸ä½¿ç¨ AbortController
ã
then()
ãcatch()
å finally()
æ¹æ³ç¨äºå°è¿ä¸æ¥çæä½ä¸å·²æ²å®ç Promise ç¸å
³èã.then()
æ¹æ³æå¤æ¥åä¸¤ä¸ªåæ°ï¼ç¬¬ä¸ä¸ªåæ°æ¯ Promise å
ç°æ¶çåè°å½æ°ï¼ç¬¬äºä¸ªåæ°æ¯ Promise æç»æ¶çåè°å½æ°ã.catch()
å .finally()
æ¹æ³å¨å
é¨è°ç¨ .then()
ï¼ä½¿é误å¤çæ´å ç®æ´ãä¾å¦ï¼.catch()
å®é
ä¸å°±æ¯ä¸ä¸ªæ²¡æä¼ éå
ç°å¤çå¨ç .then()
ãç±äºè¿äºæ¹æ³è¿å Promiseï¼å æ¤å®ä»¬å¯ä»¥è¢«é¾å¼è°ç¨ãä¾å¦ï¼
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("foo");
}, 300);
});
myPromise
.then(handleFulfilledA, handleRejectedA)
.then(handleFulfilledB, handleRejectedB)
.then(handleFulfilledC, handleRejectedC);
æä»¬å°ä½¿ç¨ä»¥ä¸æ¯è¯ï¼åå§ Promise æ¯è°ç¨ then
ç Promiseï¼æ° Promise æ¯ then
è¿åç Promiseãä¼ éç» then
ç两个åè°åå«ç§°ä¸ºå
ç°å¤çå¨åæç»å¤çå¨ã
åå§ Promise çæ²å®ç¶æå³å®äºè¦æ§è¡åªä¸ªå¤çå¨ã
å¤çå¨ç宿æ åµå³å®äºæ° Promise çæ²å®ç¶æã
ä¾å¦ï¼å¨ä¸é¢ç代ç ä¸ï¼å¦æ myPromise
æç»ï¼å°è°ç¨ handleRejectedA
ï¼å¦æ handleRejectedA
æ£å¸¸å®æï¼ä¸æåºé误æè¿å被æç»ç Promiseï¼ï¼ç¬¬ä¸ä¸ª then
è¿åç Promise å°è¢«å
ç°è䏿¯ä¿ææç»ç¶æãå æ¤ï¼å¦æå¿
é¡»ç«å³å¤çé误ï¼ä½æä»¬å¸æå¨é¾ä¸ä¿æéè¯¯ç¶æï¼æä»¬å¿
须卿ç»å¤çå¨ä¸æåºæç§ç±»åçé误ãå¦ä¸æ¹é¢ï¼å¨æ²¡æè¿«åéè¦çæ
åµä¸ï¼æä»¬å¯ä»¥å°é误å¤ççå°æç»ç .catch()
å¤çå¨ã
myPromise
.then(handleFulfilledA)
.then(handleFulfilledB)
.then(handleFulfilledC)
.catch(handleRejectedAny);
使ç¨ç®å¤´å½æ°ä½ä¸ºåè°å½æ°ï¼å®ç° Promise çé¾å¼è°ç¨ç示ä¾å¦ä¸ï¼
myPromise
.then((value) => `${value} and bar`)
.then((value) => `${value} and bar again`)
.then((value) => `${value} and again`)
.then((value) => `${value} and again`)
.then((value) => {
console.log(value);
})
.catch((err) => {
console.error(err);
});
夿³¨ï¼ ä¸ºäºæ´å¿«çæ§è¡ï¼æå¥½å°ææåæ¥æä½é½æ¾å¨ä¸ä¸ªå¤çç¨åºä¸ï¼å¦å妿å°å®ä»¬æå为å¤ä¸ªå¤çç¨åºï¼æ§è¡ææå¤çç¨åºå°éè¦å 个æ¶é卿ã
JavaScript ç»´æ¤ä¸ä¸ªä½ä¸éåãæ¯æ¬¡ï¼JavaScript ä»éåä¸éæ©ä¸ä¸ªä½ä¸å¹¶æ§è¡å°å®æãä½ä¸ç± Promise()
æé 彿°çæ§è¡å¨ãä¼ éç» then
çå¤ç卿任ä½è¿å Promise çå¹³å° API å®ä¹ãé¾ä¸ç Promise 表示è¿äºä½ä¸ä¹é´çä¾èµå
³ç³»ãå½ Promise æ²å®æ¶ï¼ä¸å
¶å
³èçç¸åºå¤çå¨ä¼è¢«æ·»å å°ä½ä¸éåçåé¢ã
ä¸ä¸ª Promise å¯ä»¥åä¸å¤ä¸ªé¾ã对äºä»¥ä¸ä»£ç ï¼promiseA
çå
ç°å°å¯¼è´ handleFulfilled1
å handleFulfilled2
é½è¢«æ·»å å°ä½ä¸éåä¸ãå 为 handleFulfilled1
é¦å
注åï¼æä»¥å®å°é¦å
被è°ç¨ã
const promiseA = new Promise(myExecutorFunc);
const promiseB = promiseA.then(handleFulfilled1, handleRejected1);
const promiseC = promiseA.then(handleFulfilled2, handleRejected2);
å¯ä»¥ä¸ºå·²ç»æ²å®ç Promise åé æä½ãå¨è¿ç§æ åµä¸ï¼æä½ä¼ç«å³æ·»å å°ä½ä¸éåçåé¢ï¼å¹¶å¨ææç°æä½ä¸å®æåæ§è¡ãå æ¤ï¼å·²ç»"æ²å®"ç Promise çæä½åªä¼å¨å½å忥代ç 宿并ä¸è³å°ç»è¿ä¸ä¸ªå¾ªç¯å¨æåæä¼åçãè¿ä¿è¯äº Promise æä½æ¯å¼æ¥çã
const promiseA = new Promise((resolve, reject) => {
resolve(777);
});
// æ¤æ¶ï¼âpromiseAâå·²ç»æ²å®äº
promiseA.then((val) => console.log("弿¥æ¥å¿è®°å½æå¼ï¼", val));
console.log("ç«å³è®°å½");
// æä»¥ä¸é¡ºåºäº§çè¾åºï¼
// ç«å³è®°å½
// 弿¥æ¥å¿è®°å½æå¼ï¼777
Thenable
å¨ Promise æä¸º JavaScript è¯è¨çä¸é¨åä¹åï¼JavaScript çæç³»ç»å·²ç»æäºå¤ç§ Promise å®ç°ã尽管å®ä»¬å¨å
é¨ç表示æ¹å¼ä¸åï¼ä½è³å°ææç±» Promise ç对象é½å®ç°äº Thenable æ¥å£ãthenable 对象å®ç°äº .then()
æ¹æ³ï¼è¯¥æ¹æ³è¢«è°ç¨æ¶éè¦ä¼ å
¥ä¸¤ä¸ªåè°å½æ°ï¼ä¸ä¸ªç¨äº Promise 被å
ç°æ¶è°ç¨ï¼ä¸ä¸ªç¨äº Promise 被æç»æ¶è°ç¨ãPromise 乿¯ thenable 对象ã
为äºä¸ç°æç Promise å®ç°è¿è¡äº¤äºï¼JavaScript è¯è¨å
è®¸å¨ Promise çä½ç½®ä½¿ç¨ thenable 对象ãä¾å¦ï¼Promise.resolve
æ¹æ³ä¸ä»
å¯ä»¥è§£æ Promise 对象ï¼è¿å¯ä»¥è¿½è¸ª thenable 对象ã
const aThenable = {
then(onFulfilled, onRejected) {
onFulfilled({
// thenable 对象被å
ç°ä¸ºå¦ä¸ä¸ª thenable 对象
then(onFulfilled, onRejected) {
onFulfilled(42);
},
});
},
};
Promise.resolve(aThenable); // ä¸ä¸ªå
ç°å¼ä¸º 42 ç Promise
Promise å¹¶å
Promise
ç±»æä¾äºåä¸ªéææ¹æ³æ¥ä¿è¿å¼æ¥ä»»å¡çå¹¶åï¼
Promise.all()
卿æä¼ å ¥ç Promise é½è¢«å ç°æ¶å ç°ï¼å¨ä»»æä¸ä¸ª Promise 被æç»æ¶æç»ã
Promise.allSettled()
卿æç Promise é½è¢«æ²å®æ¶å ç°ã
Promise.any()
å¨ä»»æä¸ä¸ª Promise 被å ç°æ¶å ç°ï¼ä» 卿æç Promise é½è¢«æç»æ¶æä¼æç»ã
Promise.race()
å¨ä»»æä¸ä¸ª Promise 被æ²å®æ¶æ²å®ãæ¢å¥è¯è¯´ï¼å¨ä»»æä¸ä¸ª Promise 被å ç°æ¶å ç°ï¼å¨ä»»æä¸ä¸ªç Promise 被æç»æ¶æç»ã
ææè¿äºæ¹æ³é½æ¥åä¸ä¸ª Promiseï¼ç¡®åå°è¯´æ¯ thenableï¼çå¯è¿ä»£å¯¹è±¡ï¼å¹¶è¿åä¸ä¸ªæ°ç Promiseãå®ä»¬é½æ¯æåç±»åï¼è¿æå³çå®ä»¬å¯ä»¥å¨ Promise
çåç±»ä¸è°ç¨ï¼ç»æå°æ¯ä¸ä¸ªå±äºå类类åç Promiseã为æ¤ï¼åç±»çæé 彿°å¿
é¡»å®ç°ä¸ Promise()
æé 彿°ç¸åçç¾åââæ¥åä¸ä¸ªä»¥ resolve
å reject
åè°å½æ°ä½ä¸ºåæ°çå个 executor
彿°ãåç±»è¿å¿
é¡»æä¸ä¸ª resolve
éææ¹æ³ï¼å¯ä»¥å Promise.resolve()
䏿 ·è°ç¨ï¼ä»¥å°å¼è§£æä¸º Promiseã
请注æï¼JavaScript çæ¬è´¨ä¸æ¯å线ç¨çï¼å æ¤å¨ä»»ä½æ¶å»ï¼åªæä¸ä¸ªä»»å¡ä¼è¢«æ§è¡ï¼å°½ç®¡æ§å¶æå¯ä»¥å¨ä¸åç Promise ä¹é´åæ¢ï¼ä»è使 Promise çæ§è¡çèµ·æ¥æ¯å¹¶åçãå¨ JavaScript ä¸ï¼å¹¶è¡æ§è¡åªè½éè¿ worker 线ç¨å®ç°ã
æé 彿°Promise()
å建ä¸ä¸ªæ°ç Promise
对象ã该æé 彿°ä¸»è¦ç¨äºå°è£
è¿æ²¡ææ·»å promise æ¯æç彿°ã
Promise[Symbol.species]
è¿åç¨äºæé ä» Promise æ¹æ³è¿åå¼çæé 彿°ã
Promise.all()
æ¥åä¸ä¸ª Promise å¯è¿ä»£å¯¹è±¡ä½ä¸ºè¾å
¥ï¼å¹¶è¿åå个 Promise
ãè¿åç Promise 卿æè¾å
¥ç Promise é½å
ç°æ¶ï¼å
æ¬ä¼ å
¥çå¯è¿ä»£å¯¹è±¡ä¸ºç©ºæ¶ï¼è¢«å
ç°ï¼å
¶å¼ä¸ºä¸ä¸ªå
嫿æå
ç°å¼çæ°ç»ã妿è¾å
¥çä»»ä½ Promise 被æç»ï¼è¿åç Promise ä¹ä¼è¢«æç»ï¼å¹¶è¿å第ä¸ä¸ªæç»çåå ã
Promise.allSettled()
æ¥åä¸ä¸ª Promise å¯è¿ä»£å¯¹è±¡ä½ä¸ºè¾å
¥ï¼å¹¶è¿åå个 Promise
ãè¿åç Promise 卿æè¾å
¥ç Promise 齿²å®æ¶å
ç°ï¼å
æ¬ä¼ å
¥çå¯è¿ä»£å¯¹è±¡ä¸ºç©ºæ¶ï¼ï¼å
¶å¼ä¸ºä¸ä¸ªæè¿°æ¯ä¸ª Promise ç»æç对象æ°ç»ã
Promise.any()
æ¥åä¸ä¸ª Promise å¯è¿ä»£å¯¹è±¡ä½ä¸ºè¾å
¥ï¼å¹¶è¿åå个 Promise
ãè¿åç Promise å¨ä»»ä½è¾å
¥ç Promise å
ç°æ¶å
ç°ï¼å
¶å¼ä¸ºç¬¬ä¸ä¸ªå
ç°çå¼ã妿ææè¾å
¥ç Promise é½è¢«æç»ï¼å
æ¬ä¼ å
¥çå¯è¿ä»£å¯¹è±¡ä¸ºç©ºæ¶ï¼ï¼è¿åç Promise å°ä»¥å¸¦æä¸ä¸ªå
嫿ç»åå çæ°ç»ç AggregateError
æç»ã
Promise.race()
æ¥åä¸ä¸ª Promise å¯è¿ä»£å¯¹è±¡ä½ä¸ºè¾å
¥ï¼å¹¶è¿åå个 Promise
ãè¿åç Promise ä¸ç¬¬ä¸ä¸ªæ²å®ç Promise çæç»ç¶æä¿æä¸è´ã
Promise.reject()
è¿åä¸ä¸ªæ°ç Promise
对象ï¼è¯¥å¯¹è±¡ä»¥ç»å®çåå æç»ã
Promise.resolve()
è¿åä¸ä¸ªæ°ç Promise
对象ï¼è¯¥å¯¹è±¡ä»¥ç»å®çå¼å
ç°ã妿弿¯ä¸ä¸ª thenable 对象ï¼å³å
·æ then
æ¹æ³ï¼ï¼åè¿åç Promise 对象ä¼âè·éâ该 thenable 对象ï¼éç¨å
¶æç»çç¶æï¼å¦åï¼è¿åç Promise 对象ä¼ä»¥è¯¥å¼å
ç°ã
Promise.try()
æ¥åä»»æç±»åçåè°å½æ°ï¼æ 论æ¯è¿åå¼è¿æ¯æåºå¼å¸¸ï¼åæ¥æå¼æ¥ï¼ï¼å¹¶å°å
¶ç»æå
è£
å¨ä¸ä¸ª Promise
ä¸ã
Promise.withResolvers()
è¿åä¸ä¸ªå¯¹è±¡ï¼è¯¥å¯¹è±¡å
å«ä¸ä¸ªæ°ç Promise
对象å两个ç¨äºè§£å³ææç»å®ç彿°ï¼è¿ä¸¤ä¸ªå½æ°å¯¹åºäºä¼ éç» Promise()
æé 彿°çæ§è¡å¨çä¸¤ä¸ªåæ°ã
è¿äºå±æ§å®ä¹å¨ Promise.prototype
ä¸ï¼ç±ææç Promise
å®ä¾å
±äº«ã
Promise.prototype.constructor
å建å®ä¾å¯¹è±¡çæé 彿°ãå¯¹äº Promise
å®ä¾ï¼åå§å¼ä¸º Promise
æé 彿°ã
Promise.prototype[Symbol.toStringTag]
[Symbol.toStringTag]
屿§çåå§å¼ä¸ºå符串 "Promise"
ãè¯¥å±æ§ç¨äº Object.prototype.toString()
ã
Promise.prototype.catch()
å°ä¸ä¸ªæç»å¤çåè°å½æ°éå å° Promise ä¸ï¼å¹¶è¿åä¸ä¸ªæ°ç Promiseï¼å¦æåè°è¢«è°ç¨ï¼åè§£å³ä¸ºåè°çè¿åå¼ï¼å¦æ Promise 被å ç°ï¼è§£å³ä¸ºå ¶åå§å ç°å¼ã
Promise.prototype.finally()
å°ä¸ä¸ªå¤çå¨éå å° Promise ä¸ï¼å¹¶è¿åä¸ä¸ªæ°ç Promiseï¼å½åå§ Promise è¢«è§£å³æ¶è§£å³ãæ 论 Promise æ¯å¦è¢«å ç°è¿æ¯è¢«æç»ï¼å¤çå¨é½ä¼å¨ Promise æ²å®æ¶è¢«è°ç¨ã
Promise.prototype.then()
å°ä¸ä¸ªå
ç°å¤çå¨åæç»å¤çå¨éå å° Promise ä¸ï¼å¹¶è¿åä¸ä¸ªæ°ç Promiseï¼è§£å³ä¸ºè°ç¨å¤çå¨å¾å°çè¿åå¼ï¼æè
妿 Promise 没æè¢«å¤çï¼å³ç¸å
³å¤çå¨ onFulfilled
æ onRejected
䏿¯å½æ°ï¼ï¼å以åå§æ²å®å¼è§£å³ã
const myFirstPromise = new Promise((resolve, reject) => {
// å½å¼æ¥æä½æåæ¶ï¼æä»¬è°ç¨ resolve(...)ï¼å½å
¶å¤±è´¥æ¶ï¼è°ç¨ reject(...)ã
// å¨è¿ä¸ªä¾åä¸ï¼æä»¬ä½¿ç¨ setTimeout(...) æ¥æ¨¡æå¼æ¥ä»£ç ã
// å¨å®é
æ
åµä¸ï¼ä½ å¯è½ä¼ä½¿ç¨ç±»ä¼¼ XHR æ HTML API çã
setTimeout(() => {
resolve("æåï¼"); // è¶ï¼ä¸å顺å©ï¼
}, 250);
});
myFirstPromise.then((successMessage) => {
// successMessage æ¯æä»¬å¨ä¸é¢ç resolve(...) 彿°ä¸ä¼ å
¥çä»»ä½å
容ã
// å®ä¸ä¸å®æ¯å符串ï¼ä½å¦æå®åªæ¯ä¸ä¸ªæåçæ¶æ¯ï¼é£ä¹å®å¤§æ¦çæ¯å符串ã
console.log(`è¶ï¼${successMessage}`);
});
ä¸ååºæ¯ç示ä¾
æ¤ç¤ºä¾å±ç¤ºäºä½¿ç¨ promise çå¤ç§æ¹æ³ï¼ä»¥åå
¶å¯è½åççå¤ç§æ
åµãè¦çè§£è¿ä¸ç¹ï¼é¦å
æ»å¨å°ä»£ç åçåºé¨ï¼ç¶åæ¥ç promise è°ç¨é¾ãå¨å建åå§ç promise åï¼å¯ä»¥æ¥ä¸ä¸æ¡ promise è°ç¨é¾ã该è°ç¨é¾ç± .then()
ç»æï¼é常ï¼ä½ä¸ä¸å®ï¼å¨æ«å°¾ä¼æä¸ä¸ª .catch()
ï¼å¹¶å¯è½ä¼æ¥ä¸ä¸ä¸ª .finally()
ã卿¬ç¤ºä¾ä¸ï¼promise è°ç¨é¾æ¯ç±ä¸ä¸ªèªå®ä¹ç new Promise()
æé å¹¶åèµ·çï¼ä½å¨å®è·µä¸ï¼promise è°ç¨é¾é常ç±ä¸ä¸ª API 彿°ï¼ç±å
¶ä»äººç¼åçï¼è¿åç promise å¼å§ã
示ä¾å½æ° tetheredGetNumber()
ä¼å¨è®¾ç½®åæ¥è°ç¨æè
彿°å
鍿åºå¼å¸¸æ¶è°ç¨ reject()
ã彿° promiseGetWord()
å±ç¤ºäºå¦ä½å¨ API 彿°å
é¨å建并è¿åä¸ä¸ª promiseã
请注æï¼å½æ° troubleWithGetNumber()
以 throw()
ç»æãè¿æ¯å¼ºå¶çåæ³ï¼å 为 ES6 ç promise ä¼éåææç .then()
promiseï¼å¨éå°é误æ¶ï¼å¦æä¸ä½¿ç¨ throw()
ï¼è¿ä¸ªé误ä¼è¢«å½ä½â已修å¤âãè¿å¾éº»ç¦ï¼å æ¤ï¼é常ä¼å¨ .then()
promise è°ç¨é¾ä¸å¿½ç¥ rejectionFunc
ï¼èä»
卿åç .catch()
ä¸ä¿çä¸ä¸ª rejectionFunc
ãå¦ä¸ç§æ¹æ³æ¯æåºä¸ä¸ªç¹æ®å¼ï¼æ¬ä¾ä½¿ç¨äº -999
ï¼ä½ä½¿ç¨èªå®ä¹éè¯¯ç±»åæ´åéï¼ã
æ¤ä»£ç å¯å¨ NodeJS ä¸è¿è¡ãéè¿çå°é误çå®é
åçï¼å¯ä»¥å æ·±çè§£ãè¥è¦æé«é误åççæ¦çï¼è¯·æ´æ¹ threshold
å¼ã
// 为äºå°è¯é误å¤çï¼ä½¿ç¨âéå¼âå¼ä¼éæºå°å¼åé误ã
const THRESHOLD_A = 8; // å¯ä»¥ä½¿ç¨ 0 使é误å¿
ç°
function tetheredGetNumber(resolve, reject) {
setTimeout(() => {
const randomInt = Date.now();
const value = randomInt % 10;
if (value < THRESHOLD_A) {
resolve(value);
} else {
reject(`太大äºï¼${value}`);
}
}, 500);
}
function determineParity(value) {
const isOdd = value % 2 === 1;
return { value, isOdd };
}
function troubleWithGetNumber(reason) {
const err = new Error("è·åæ°æ®æ¶éå°é®é¢", { cause: reason });
console.error(err);
throw err;
}
function promiseGetWord(parityInfo) {
return new Promise((resolve, reject) => {
const { value, isOdd } = parityInfo;
if (value >= THRESHOLD_A - 1) {
reject(`è¿æ¯å¤ªå¤§äºï¼${value}`);
} else {
parityInfo.wordEvenOdd = isOdd ? "奿°" : "å¶æ°";
resolve(parityInfo);
}
});
}
new Promise(tetheredGetNumber)
.then(determineParity, troubleWithGetNumber)
.then(promiseGetWord)
.then((info) => {
console.log(`å¾å°äºï¼${info.value}, ${info.wordEvenOdd}`);
return info;
})
.catch((reason) => {
if (reason.cause) {
console.error("å·²ç»å¨åé¢å¤çè¿é误äº");
} else {
console.error(`è¿è¡ promiseGetWord() æ¶éå°é®é¢ï¼${reason}`);
}
})
.finally((info) => console.log("ææåè°é½å®æäº"));
é«çº§ç¤ºä¾
æ¬ä¾å±ç¤ºäº Promise
çä¸äºæºå¶ãtestPromise()
æ¹æ³å¨æ¯æ¬¡ç¹å» <button>
æé®æ¶è¢«è°ç¨ï¼è¯¥æ¹æ³ä¼å建ä¸ä¸ª promise 对象ï¼ä½¿ç¨ setTimeout()
让 Promise
çå¾
1-3 ç§ä¸ççæ¶é´æ¥å
ç°è®¡æ°ç»æï¼ä» 1 å¼å§çæ°åï¼ãä½¿ç¨ Promise
æé 彿°æ¥å建 promiseã
éè¿ä½¿ç¨ p1.then()
设置å
ç°åè°å½æ°ï¼å¹¶å¨å
¶ä¸è®°å½ Promise çå
ç°ï¼è¿äºæ¥å¿æ¾ç¤ºäºæ¹æ³çåæ¥ä»£ç æ¯å¦ä½ä¸ Promise ç弿¥å®ææ¯å¦ä½è§£è¦çã
éè¿å¨çæ¶é´å 夿¬¡ç¹å»æé®ï¼ä½ å¯ä»¥çå°ä¸åç promise 被ä¸ä¸ªæ¥ä¸ä¸ªå°å ç°ã
HTML<button id="make-promise">Make a promise!</button>
<div id="log"></div>
JavaScript
"use strict";
let promiseCount = 0;
function testPromise() {
const thisPromiseCount = ++promiseCount;
const log = document.getElementById("log");
// å¼å§
log.insertAdjacentHTML("beforeend", `${thisPromiseCount}) Started<br>`);
// æä»¬å建ä¸ä¸ªæ°ç Promiseï¼æä»¬æ¿è¯ºå¨çå¾
3 ç§åï¼å
ç°ä» 1 å¼å§è®¡æ°çæ°å
const p1 = new Promise((resolve, reject) => {
// æ§è¡å¨å½æ°è¢«è°ç¨ï¼å¹¶å
·æè§£å³ææç»è¯¥ Promise çè½å
log.insertAdjacentHTML(
"beforeend",
`${thisPromiseCount}) Promise constructor<br>`,
);
// è¿åªæ¯ä¸ä¸ªåå»ºå¼æ¥æä½ç示ä¾
setTimeout(
() => {
// We fulfill the promise
resolve(thisPromiseCount);
},
Math.random() * 2000 + 1000,
);
});
// æä»¬ä½¿ç¨ then() æ¥å®ä¹ Promise è¢«è§£å³æ¶çæä½ï¼
// å¹¶ä½¿ç¨ catch() æ¥å®ä¹ Promise 被æç»æ¶çæä½
p1.then((val) => {
// æå°å
ç°å¼
log.insertAdjacentHTML("beforeend", `${val}) Promise fulfilled<br>`);
}).catch((reason) => {
// æå°æç»åå
console.log(`Handle rejected promise (${reason}) here.`);
});
// ç»æ
log.insertAdjacentHTML("beforeend", `${thisPromiseCount}) Promise made<br>`);
}
const btn = document.getElementById("make-promise");
btn.addEventListener("click", testPromise);
ç»æ ä½¿ç¨ XHR å è½½å¾å
å¦ä¸ä¸ªä½¿ç¨ Promise
å XMLHttpRequest
å è½½å¾åç示ä¾å¦ä¸æç¤ºãæ¯ä¸æ¥é½ææ³¨éï¼å¯ä»¥è®©ä½ 详ç»äºè§£ Promise å XHR æ¶æã
function imgLoad(url) {
// ä½¿ç¨ Promise() æé 彿°å建æ°ç promiseï¼
// å®çåæ°æ¯ä¸ä¸ªæä¸¤ä¸ªåæ°ç彿°ï¼resolve å reject
return new Promise((resolve, reject) => {
// ä½¿ç¨ XHR å è½½å¾å
const request = new XMLHttpRequest();
request.open("GET", url);
request.responseType = "blob";
// å½è¯·æ±å è½½æ¶ï¼æ£æ¥å®æ¯å¦æå
request.onload = () => {
if (request.status === 200) {
// 妿æåï¼éè¿ä¼ å请æ±ååºæ¥è§£å³ promise
resolve(request.response);
} else {
// å¦æå¤±è´¥ï¼ç¨éè¯¯æ¶æ¯æç» promise
reject(
Error(
`Image didn't load successfully; error code: + ${request.statusText}`,
),
);
}
};
// å¤çç½ç»é误
request.onerror = () => reject(new Error("There was a network error."));
// åé请æ±
request.send();
});
}
// è·å对 body å
ç´ çå¼ç¨ï¼å¹¶å建ä¸ä¸ªæ°çå¾å对象
const body = document.querySelector("body");
const myImage = new Image();
const imgUrl =
"https://mdn.github.io/shared-assets/images/examples/round-balloon.png";
// ä½¿ç¨æä»¬æ³è¦å è½½ç URL è°ç¨å½æ°ï¼ç¶åé¾å¼è°ç¨
// promise then() æ¹æ³å两个åè°
imgLoad(imgUrl).then(
(response) => {
// 第ä¸ä¸ªå¨ promise è§£å³æ¶è¿è¡ï¼ä½¿ç¨å¨ resolve() æ¹æ³ä¸æå®ç request.responseã
const imageURL = URL.createObjectURL(response);
myImage.src = imageURL;
body.appendChild(myImage);
},
(error) => {
// 第äºä¸ªå¨ promise 被æç»æ¶è¿è¡ï¼
// å¹¶è®°å½ç¨ reject() æ¹æ³æå®çé误ã
console.log(error);
},
);
è¿½è¸ªç°æè®¾ç½®å¯¹è±¡
设置对象ï¼settings objectï¼æ¯ JavaScript 代ç è¿è¡æ¶ç¨äºæä¾éå ä¿¡æ¯çç¯å¢ãå®å å«äºé¢åï¼realmï¼åæ¨¡åæ å°ï¼module mapï¼ï¼ä»¥å HTML çç¹å®ä¿¡æ¯ï¼å¦æ¥æºï¼originï¼çãå¯¹ç°æè®¾ç½®å¯¹è±¡ç追踪ä¿è¯äºæµè§å¨ç¥éç¨æ·ç»å®çåªäºä»£ç çæ®µéè¦ä½¿ç¨ã
ä¸ºäºæ´å¥½å°è¯´æè¿ä¸ç¹ï¼æä»¬å¨è¿éè¿ä¸æ¥æ¢è®¨é¢åæ¯å¦ä½å¼åé®é¢çãæä»¬å¯ä»¥ç²ç¥å°è®¤ä¸ºé¢åæ¯ä¸ä¸ªå
¨å±å¯¹è±¡ãå
¶ç¬ç¹ä¹å¤å¨äºï¼å®æ¥æè¿è¡ JavaScript ä»£ç æéçææä¿¡æ¯ãè¿å
æ¬å Array
å Error
è¿æ ·çå¯¹è±¡ãæ¯ä¸ä¸ªè®¾ç½®å¯¹è±¡é½æèªå·±çâ坿¬âï¼èä¸å®ä»¬ä¸å¯æ¬ä¹é´æ¯ä¸å
±äº«çãè¿å¯è½ä¼å¯¼è´ä¸äºä¸ promise ç¸å
³çæå¤è¡ä¸ºã为äºè§£å³è¿ä¸ªé®é¢ï¼æä»¬éè¦è¿½è¸ªç°æè®¾ç½®å¯¹è±¡ï¼incumbent settings objectï¼ãå®è¡¨ç¤ºè´è´£ç¨æ·æä¸ªå½æ°è°ç¨å·¥ä½çç¹å®ä¿¡æ¯ã
æä»¬å¯ä»¥å°è¯å¨ææ¡£ä¸åµå
¥ <iframe>
ï¼å¹¶è®©å
¶ä¸ç¶çº§ä¸ä¸æéä¿¡ãç±äºææç web API é½æç°æè®¾ç½®å¯¹è±¡ï¼ä¸é¢ç代ç è½å¤å¨ææçæµè§å¨ä¸è¿è¡ï¼
<!doctype html> <iframe></iframe>
<!-- å¨è¿éæä¸ä¸ª realm -->
<script>
// è¿é乿ä¸ä¸ª realm
const bound = frames[0].postMessage.bind(frames[0], "ä¸äºæ°æ®", "*");
// bound æ¯ä¸ä¸ªå
ç½®å½æ°ï¼æ 䏿²¡æç¨æ·ä»£ç ï¼å æ¤æä»¬åºè¯¥ä½¿ç¨åªä¸ª realm å¢ï¼
setTimeout(bound);
// è¿ä»ç¶å¯ä»¥å·¥ä½ï¼å 为æä»¬å¨æ ä¸ä½¿ç¨ææ°ç realmï¼å³ç°æç realmï¼
</script>
åæ ·çæ¦å¿µä¹éç¨äº promiseã妿æä»¬ç¨å ä¿®æ¹ä¸é¢ç示ä¾ï¼æä»¬å°±è½å¾å°è¿ä¸ªï¼
<!doctype html> <iframe></iframe>
<!-- å¨è¿éæä¸ä¸ªé¢å -->
<script>
// è¿é乿ä¸ä¸ªé¢å
const bound = frames[0].postMessage.bind(frames[0], "ä¸äºæ°æ®", "*");
// bound æ¯ä¸ä¸ªå
ç½®å½æ°ï¼æ 䏿²¡æç¨æ·ä»£ç ï¼æä»¥æä»¬åºè¯¥ä½¿ç¨åªä¸ªé¢åï¼
Promise.resolve(undefined).then(bound);
// è¿ä»ç¶å¯ä»¥å·¥ä½ï¼å 为æä»¬å¨æ ä¸ä½¿ç¨ææ°çé¢åï¼å³ç°æé¢åï¼
</script>
妿æä»¬ä¿®æ¹ä»£ç ï¼ä½¿ç¨ææ¡£ä¸ç <iframe>
æ¥çå¬åéçæ¶æ¯ï¼æä»¬å¯ä»¥è§å¯å°ç°æè®¾ç½®å¯¹è±¡çå½±åï¼
<!-- y.html -->
<!doctype html>
<iframe src="x.html"></iframe>
<script>
const bound = frames[0].postMessage.bind(frames[0], "ä¸äºæ°æ®", "*");
Promise.resolve(undefined).then(bound);
</script>
<!-- x.html -->
<!doctype html>
<script>
window.addEventListener(
"message",
(event) => {
document.querySelector("#text").textContent = "hello";
// æ¤ä»£ç å°ä»
å¨è·è¸ªç°æè®¾ç½®å¯¹è±¡çæµè§å¨ä¸è¿è¡
console.log(event);
},
false,
);
</script>
å¨ä¸é¢ç示ä¾ä¸ï¼<iframe>
ä»
å¨ç°æè®¾ç½®å¯¹è±¡è¢«è¿½è¸ªæ¶æä¼è¢«æ´æ°ãè¿æ¯å 为å¨ä¸è¿½è¸ªçæ
åµä¸ï¼æä»¬å¯è½ä¼ä½¿ç¨é误çç¯å¢åéæ¶æ¯ã
夿³¨ï¼ ç®åï¼Firefox å®å ¨å®ç°äºç°æé¢å追踪ï¼Chrome å Safari ä» é¨åå®ç°ã
è§è æµè§å¨å ¼å®¹æ§ åè§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