Promise
æ¯ä¸ä¸ªå¯¹è±¡ï¼å®ä»£è¡¨äºä¸ä¸ªå¼æ¥æä½çæç»å®ææè
失败ãå ä¸ºå¤§å¤æ°äººä»
ä»
æ¯ä½¿ç¨å·²å建ç Promise å®ä¾å¯¹è±¡ï¼æä»¥æ¬æç¨å°é¦å
è¯´æææ ·ä½¿ç¨ Promiseï¼å说æå¦ä½å建 Promiseã
æ¬è´¨ä¸ Promise æ¯ä¸ä¸ªå½æ°è¿åçå¯¹è±¡ï¼æä»¬å¯ä»¥å¨å®ä¸é¢ç»å®åè°å½æ°ï¼è¿æ ·æä»¬å°±ä¸éè¦å¨ä¸å¼å§æåè°å½æ°ä½ä¸ºåæ°ä¼ å ¥è¿ä¸ªå½æ°äºã
å设ç°å¨æä¸ä¸ªå为 createAudioFileAsync()
ç彿°ï¼å®æ¥æ¶ä¸äºé
ç½®å两个åè°å½æ°ï¼ç¶å弿¥å°çæé³é¢æä»¶ãä¸ä¸ªåè°å½æ°å¨æä»¶æåå建æ¶è¢«è°ç¨ï¼å¦ä¸ä¸ªåå¨åºç°å¼å¸¸æ¶è¢«è°ç¨ã
以ä¸ä¸ºä½¿ç¨ createAudioFileAsync()
ç示ä¾ï¼
// æåçåè°å½æ°
function successCallback(result) {
console.log("é³é¢æä»¶å建æåï¼" + result);
}
// 失败çåè°å½æ°
function failureCallback(error) {
console.log("é³é¢æä»¶å建失败ï¼" + error);
}
createAudioFileAsync(audioSettings, successCallback, failureCallback);
妿éå createAudioFileAsync()
为è¿å Promise çå½¢å¼ï¼ä½ å¯ä»¥æåè°å½æ°éå å°å®ä¸é¢ï¼
createAudioFileAsync(audioSettings).then(successCallback, failureCallback);
è¿ç§å½¢å¼æè¥å¹²ä¼ç¹ï¼ä¸é¢æä»¬å°ä¼éä¸è®¨è®ºã
é¾å¼è°ç¨è¿ç»æ§è¡ä¸¤ä¸ªæè å¤ä¸ªå¼æ¥æä½æ¯ä¸ä¸ªå¸¸è§çéæ±ï¼å¨ä¸ä¸ä¸ªæä½æ§è¡æåä¹åï¼å¼å§ä¸ä¸ä¸ªçæä½ï¼å¹¶å¸¦çä¸ä¸æ¥æä½æè¿åçç»æã卿§çåè°é£æ ¼ä¸ï¼è¿ç§æä½ä¼å¯¼è´ç»å ¸çåè°å°ç±ï¼
doSomething(function (result) {
doSomethingElse(result, function (newResult) {
doThirdThing(newResult, function (finalResult) {
console.log(`å¾å°æç»ç»æï¼${finalResult}`);
}, failureCallback);
}, failureCallback);
}, failureCallback);
æäº Promiseï¼æä»¬å°±å¯ä»¥éè¿ä¸ä¸ª Promise 龿¥è§£å³è¿ä¸ªé®é¢ãè¿å°±æ¯ Promise API çä¼å¿ï¼å 为åè°å½æ°æ¯éå å°è¿åç Promise 对象ä¸çï¼è䏿¯ä¼ å ¥ä¸ä¸ªå½æ°ä¸ã
è§è¯å¥è¿¹çæ¶å»ï¼then()
彿°ä¼è¿åä¸ä¸ªå忥ä¸åçæ°ç Promiseï¼
const promise = doSomething();
const promise2 = promise.then(successCallback, failureCallback);
第äºä¸ª promiseï¼promise2
ï¼ä¸ä»
表示 doSomething()
彿°ç宿ï¼ä¹ä»£è¡¨äºä½ ä¼ å
¥ç successCallback
æè
failureCallback
ç宿ï¼è¿ä¸¤ä¸ªå½æ°ä¹å¯ä»¥æ¯è¿å Promise 对象ç弿¥å½æ°ãè¿æ ·çè¯ï¼å¨ promise2
䏿°å¢çæå¨è¯¥ promise åé¢çåè°å½æ°ä¼éè¿ successCallback
æ failureCallback
è¿åã
夿³¨ï¼ å¦æä½ æ³è¦ä¸ä¸ªå¯ä»¥æä½ç示ä¾ï¼ä½ å¯ä»¥ä½¿ç¨ä¸é¢çæ¨¡æ¿æ¥å建任ä½è¿å Promise ç彿°ï¼
function doSomething() {
return new Promise((resolve) => {
setTimeout(() => {
// å¨å®æ Promise ä¹åçå
¶ä»æä½
console.log("宿äºä¸äºäºæ
");
// promise çå
ç°å¼
resolve("https://example.com/");
}, 200);
});
}
该å®ç°ä¼å¨ä¸é¢ç卿§å¼åè° API ä¸å建 Promiseé¨å讨论ã
å°±åè¿æ ·ï¼ä½ å¯ä»¥å建ä¸ä¸ªæ´é¿çå¤çé¾ï¼å
¶ä¸çæ¯ä¸ª Promise é½ä»£è¡¨äºé¾ä¸çä¸ä¸ªå¼æ¥è¿ç¨çå®æãæ¤å¤ï¼then
çåæ°æ¯å¯éçï¼catch(failureCallback)
çåäº then(null, failureCallback)
ââæä»¥å¦æä½ çé误å¤ç代ç å¯¹æææ¥éª¤é½æ¯ä¸æ ·çï¼ä½ å¯ä»¥æå®éå å°é¾çæ«å°¾ï¼
doSomething()
.then(function (result) {
return doSomethingElse(result);
})
.then(function (newResult) {
return doThirdThing(newResult);
})
.then(function (finalResult) {
console.log(`å¾å°æç»ç»æï¼${finalResult}`);
})
.catch(failureCallback);
ä½ æè®¸ä¼çå°è¿ç§å½¢å¼çç®å¤´å½æ°ï¼
doSomething()
.then((result) => doSomethingElse(result))
.then((newResult) => doThirdThing(newResult))
.then((finalResult) => {
console.log(`å¾å°æç»ç»æï¼${finalResult}`);
})
.catch(failureCallback);
夿³¨ï¼ ç®å¤´å½æ°è¡¨è¾¾å¼å¯ä»¥æéå¼è¿åå¼ï¼æä»¥ï¼() => x
æ¯ () => { return x; }
çç®åã
doSomethingElse
å doThirdThing
å¯ä»¥è¿åä»»ä½å¼ââ妿å®ä»¬è¿åçæ¯ Promiseï¼é£ä¹ä¼é¦å
çå¾
è¿ä¸ª Promise çæ²å®ï¼ç¶åä¸ä¸ä¸ªåè°å½æ°ä¼æ¥æ¶å°å®çå
ç°å¼ï¼è䏿¯ Promise æ¬èº«ãå¨ then
åè°ä¸å§ç»è¿å Promise æ¯é常éè¦çï¼å³ä½¿ Promise æ»æ¯å
ç°ä¸º undefined
ã妿ä¸ä¸ä¸ªå¤çå¨å¯å¨äºä¸ä¸ª Promise ä½å¹¶æ²¡æè¿åå®ï¼é£ä¹å°±æ²¡æåæ³å追踪å®çæ²å®ç¶æäºï¼è¿ä¸ª Promise å°±æ¯âæ¼æµ®âçã
doSomething()
.then((url) => {
// fetch(url) åç¼ºå° `return` å
³é®åã
fetch(url);
})
.then((result) => {
// result æ¯ undefinedï¼å 为ä¸ä¸ä¸ªå¤ç卿²¡æè¿åä»»ä½ä¸è¥¿ã
// æ æ³å¾ç¥ fetch() çè¿åå¼ï¼ä¹æ æ³ç¥é宿¯å¦æåã
});
éè¿è¿å fetch
è°ç¨çç»æï¼ä¸ä¸ª Promiseï¼ï¼æä»¬æ¢å¯ä»¥è¿½è¸ªå®çå®æç¶æï¼ä¹å¯ä»¥å¨å®å®ææ¶æ¥æ¶å°å®çå¼ã
doSomething()
.then((url) => {
// æ·»å `return` å
³é®å
return fetch(url);
})
.then((result) => {
// result æ¯ä¸ä¸ª Response 对象
});
妿æç«ææ¡ä»¶çè¯ï¼ä½¿ Promise æ¼æµ®çæ
åµä¼æ´ç³ââ妿ä¸ä¸ä¸ªå¤çå¨ç Promise 没æè¿åï¼é£ä¹ä¸ä¸ä¸ª then
å¤çå¨ä¼è¢«æåè°ç¨ï¼èå®è¯»åçä»»ä½å¼é½å¯è½æ¯ä¸å®æ´çã
const listOfIngredients = [];
doSomething()
.then((url) => {
// fetch(url) åç¼ºå° `return` å
³é®åã
fetch(url)
.then((res) => res.json())
.then((data) => {
listOfIngredients.push(data);
});
})
.then(() => {
console.log(listOfIngredients);
// listOfIngredients æ°¸è¿ä¸º []ï¼å 为 fetch 请æ±è¿æ²¡æå®æã
});
å æ¤ï¼ä¸ä¸ªç»éªæ³åæ¯ï¼æ¯å½ä½ çæä½éå°ä¸ä¸ª Promiseï¼å°±è¿åå®ï¼å¹¶æå®çå¤çæ¨è¿å°ä¸ä¸ä¸ª then
å¤çå¨ä¸ã
const listOfIngredients = [];
doSomething()
.then((url) => {
// fetch è°ç¨åé¢ç°å¨å
å«äº `return` å
³é®åã
return fetch(url)
.then((res) => res.json())
.then((data) => {
listOfIngredients.push(data);
});
})
.then(() => {
console.log(listOfIngredients);
// listOfIngredients ç°å¨å°å
嫿¥èª fetch è°ç¨çæ°æ®ã
});
æ´å 好çè§£å³æ¹æ³æ¯ï¼ä½ å¯ä»¥å°åµå¥é¾æå¹³å为åé¾ï¼è¿æ ·æ´ç®åï¼ä¹æ´å®¹æå¤çé误ãå ·ä½ç»èå°å¨ä¸é¢çåµå¥é¨å讨论ã
doSomething()
.then((url) => fetch(url))
.then((res) => res.json())
.then((data) => {
listOfIngredients.push(data);
})
.then(() => {
console.log(listOfIngredients);
});
ä½¿ç¨ async
/await
å¯ä»¥å¸®å©ä½ ç¼åæ´ç´è§ãæ´ç±»ä¼¼åæ¥ä»£ç ç代ç ãä¸é¢æ¯ä½¿ç¨ async
/await
çç¸å示ä¾ï¼
async function logIngredients() {
const url = await doSomething();
const res = await fetch(url);
const data = await res.json();
listOfIngredients.push(data);
console.log(listOfIngredients);
}
请注æï¼é¤äºåé¢ç await
å
³é®åå¤ï¼è¿æ®µä»£ç çèµ·æ¥ä¸åæ¥ä»£ç 䏿¨¡ä¸æ ·ãå¯ä¸çæè¡·æ¯ï¼å¯è½å¾å®¹æå¿è®° await
å
³é®åï¼è¿åªè½å¨åºç°ç±»åä¸å¹é
ï¼ä¾å¦è¯å¾å°æ¿è¯ºä½ä¸ºå¼ä½¿ç¨ï¼æ¶æè½è§£å³ã
async
/await
åºäº promiseï¼ä¾å¦ï¼doSomething()
ä¸ä¹åç彿°ç¸åï¼å æ¤ä» promise å° async
/await
æéçéæå·¥ä½å¾®ä¹å
¶å¾®ãæå
³ async
/await
è¯æ³çæ´å¤ä¿¡æ¯ï¼è¯·åé
弿¥å½æ°å await
åèã
夿³¨ï¼ async/await çå¹¶åè¯ä¹ä¸æ®é Promise é¾ç¸åã弿¥å½æ°ä¸ç await
ä¸ä¼åæ¢æ´ä¸ªç¨åºï¼åªä¼åæ¢ä¾èµå
¶å¼çé¨åï¼å æ¤å¨ await
æèµ·æ¶ï¼å
¶ä»å¼æ¥ä»»å¡ä»å¯è¿è¡ã
ä½ æè®¸è¿æå°è±¡ï¼å¨ä¹åçåè°å°ç±ç¤ºä¾ä¸ï¼æ 3 次 failureCallback
çè°ç¨ï¼èå¨ Promise é¾ä¸åªæå°¾é¨ç䏿¬¡è°ç¨ã
doSomething()
.then((result) => doSomethingElse(result))
.then((newResult) => doThirdThing(newResult))
.then((finalResult) => console.log(`å¾å°æç»ç»æï¼${finalResult}`))
.catch(failureCallback);
é常ï¼ä¸éå°å¼å¸¸æåºï¼æµè§å¨å°±ä¼é¡ºç Promise é¾å¯»æ¾ä¸ä¸ä¸ª onRejected
失败åè°å½æ°æè
ç± .catch()
æå®çåè°å½æ°ãè¿å以ä¸åæ¥ä»£ç çå·¥ä½åçï¼æ§è¡è¿ç¨ï¼é常ç¸ä¼¼ã
try {
let result = syncDoSomething();
let newResult = syncDoSomethingElse(result);
let finalResult = syncDoThirdThing(newResult);
console.log(`å¾å°æç»ç»æï¼${finalResult}`);
} catch (error) {
failureCallback(error);
}
è¿ç§å¼æ¥ä»£ç ç对称æ§å¨ async
/await
è¯æ³ä¸è¾¾å°äºæè´ï¼
async function foo() {
try {
const result = await doSomething();
const newResult = await doSomethingElse(result);
const finalResult = await doThirdThing(newResult);
console.log(`å¾å°æç»ç»æï¼${finalResult}`);
} catch (error) {
failureCallback(error);
}
}
åµå¥
对æ¯ä¸è¿°æ¶å listOfIngredients
ç两个ä¾åï¼ç¬¬ä¸ä¸ªä¾å䏿ä¸ä¸ª Promise é¾åµå¥å¨å¦ä¸ä¸ª then()
å¤çå¨çè¿åå¼ä¸ï¼è第äºä¸ªä¾å忝å®å
¨æå¹³åçé¾ãç®æ´ç Promise é¾å¼ç¼ç¨æå¥½ä¿ææå¹³åï¼ä¸è¦åµå¥ Promiseï¼å 为åµå¥ç»å¸¸ä¼æ¯ç²å¿å¯¼è´çã
åµå¥æ¯ä¸ç§å¯ä»¥éå¶ catch
è¯å¥çä½ç¨åçæ§å¶ç»æåæ³ãæç¡®æ¥è¯´ï¼åµå¥ç catch
åªä¼æè·å
¶ä½ç¨åå以ä¸çé误ï¼èä¸ä¼æè·é¾ä¸æ´é«å±çé误ãå¦æä½¿ç¨æ£ç¡®ï¼å¯ä»¥å®ç°ç»ç²åº¦çé误æ¢å¤ã
doSomethingCritical()
.then((result) =>
doSomethingOptional()
.then((optionalResult) => doSomethingExtraNice(optionalResult))
.catch((e) => {}),
) // å³ä¾¿å¯éæä½å¤±è´¥äºï¼ä¹ä¼ç»§ç»æ§è¡
.then(() => moreCriticalStuff())
.catch((e) => console.log(`严é失败ï¼${e.message}`));
注æï¼è¿éçå¯éæä½æ¯åµå¥çââ缩è¿å¹¶ä¸æ¯åå ï¼èæ¯å 为å¯éæä½è¢«å¤å±ç (
å )
æ¬å·å
裹起æ¥äºã
è¿ä¸ªå
é¨ç catch
è¯å¥ä»
è½æè·å° doSomethingOptional()
å doSomethingExtraNice()
ç失败ï¼å¹¶å°è¯¥é误ä¸å¤çå±è½ï¼ä¹åå°±æ¢å¤å° moreCriticalStuff()
ç»§ç»æ§è¡ãå¼å¾æ³¨æçæ¯ï¼å¦æ doSomethingCritical()
失败ï¼è¿ä¸ªé误ä»
ä¼è¢«æåçï¼å¤é¨ï¼catch
è¯å¥æè·å°ï¼å¹¶ä¸ä¼è¢«å
é¨ catch
åæã
å¨ async
/await
ä¸ï¼è¿æ®µä»£ç çèµ·æ¥åè¿æ ·ï¼
async function main() {
try {
const result = await doSomethingCritical();
try {
const optionalResult = await doSomethingOptional(result);
await doSomethingExtraNice(optionalResult);
} catch (e) {
// 忽ç¥å¯éæ¥éª¤çå¤±è´¥å¹¶ç»§ç»æ§è¡ã
}
await moreCriticalStuff();
} catch (e) {
console.error(`严é失败ï¼${e.message}`);
}
}
夿³¨ï¼ å¦ææ²¡æå¤æçé误å¤çï¼åå¾å¯è½ä¸éè¦åµå¥ç then
å¤çå¨ãç¸åï¼å¯ä»¥ä½¿ç¨æå¹³é¾ï¼å°é误å¤çé»è¾æ¾å¨æåã
æå¯è½ä¼å¨ä¸ä¸ªåè°å¤±è´¥ä¹åç»§ç»ä½¿ç¨é¾å¼æä½ï¼å³ï¼ä½¿ç¨ä¸ä¸ª catch
ï¼è¿å¯¹äºå¨é¾å¼æä½ä¸æåºä¸ä¸ªå¤±è´¥ä¹åï¼å次è¿è¡æ°çæä½ä¼å¾æç¨ã请é
读ä¸é¢çä¾åï¼
new Promise((resolve, reject) => {
console.log("åå§å");
resolve();
})
.then(() => {
throw new Error("æåªéä¸å¯¹äº");
console.log("æ§è¡ãè¿ä¸ªã");
})
.catch(() => {
console.log("æ§è¡ãé£ä¸ªã");
})
.then(() => {
console.log("æ§è¡ãè¿ä¸ªãï¼æ 论åé¢åçäºä»ä¹");
});
è¾åºç»æå¦ä¸ï¼
åå§å æ§è¡ãé£ä¸ªã æ§è¡ãè¿ä¸ªãï¼æ 论åé¢åçäºä»ä¹
夿³¨ï¼ 并没æè¾åºâæ§è¡ãè¿ä¸ªãâï¼å 为å¨ç¬¬ä¸ä¸ª then()
ä¸ç throw
è¯å¥å¯¼è´å
¶è¢«æç»ã
å¨ async
/await
ä¸ï¼è¿æ®µä»£ç çèµ·æ¥åè¿æ ·ï¼
async function main() {
try {
await doSomething();
throw new Error("æåªéä¸å¯¹äº");
console.log("æ§è¡ãè¿ä¸ªã");
} catch (e) {
console.error("æ§è¡ãé£ä¸ªã");
}
console.log("æ§è¡ãè¿ä¸ªãï¼æ 论åé¢åçäºä»ä¹");
}
Promise æç»äºä»¶
å½ä¸ä¸ª Promise æç»äºä»¶æªè¢«ä»»ä½å¤çå¨å¤çæ¶ï¼å®ä¼å泡å°è°ç¨æ çé¡¶é¨ï¼ä¸»æºéè¦å°å
¶æ´é²åºæ¥ãå¨ Web ä¸ï¼å½ Promise 被æç»æ¶ï¼ä¼æä¸ææè¿°ç两个äºä»¶ä¹ä¸è¢«æ´¾åå°å
¨å±ä½ç¨åï¼é常èè¨ï¼å°±æ¯ window
ï¼å¦ææ¯å¨ web worker ä¸ä½¿ç¨çè¯ï¼å°±æ¯ Worker
æè
å
¶ä»åºäº worker çæ¥å£ï¼ãè¿ä¸¤ä¸ªäºä»¶å¦ä¸æç¤ºï¼
unhandledrejection
å½ promise 被æç»ï¼ä½æ²¡æå¯ç¨çæç»å¤ç卿¶ï¼ä¼æ´¾åæ¤äºä»¶ã
rejectionhandled
å½ä¸ä¸ªè¢«æç»ç promise å¨è§¦åäº unhandledrejection
äºä»¶ä¹åæéå å¤ç卿¶ï¼ä¼æ´¾åæ¤äºä»¶ã
ä¸è¿°ä¸¤ç§äºä»¶ï¼ç±»å为 PromiseRejectionEvent
ï¼é½æä¸¤ä¸ªå±æ§ï¼ä¸ä¸ªæ¯ promise
屿§ï¼è¯¥å±æ§æå被æç»ç Promiseï¼å¦ä¸ä¸ªæ¯ reason
屿§ï¼è¯¥å±æ§ç¨æ¥è¯´æ Promise 被æç»çåå ã
å æ¤ï¼æä»¬å¯ä»¥éè¿ä»¥ä¸äºä»¶ä¸º Promise å¤±è´¥æ¶æä¾è¡¥å¿å¤çï¼ä¹æå©äºè°è¯ Promise ç¸å ³çé®é¢ã卿¯ä¸ä¸ªä¸ä¸æä¸ï¼è¯¥å¤ç齿¯å ¨å±çï¼å æ¤ä¸ç®¡æºç å¦ä½ï¼ææçé误é½ä¼å¨åä¸ä¸ªå¤ç彿°ä¸è¢«ææå¹¶å¤çã
å¨ Node.js ä¸ï¼å¯¹æç»äºä»¶çå¤çç¨æä¸åãä½ å¯ä»¥éè¿ä¸º Node.js ç unhandledRejection
äºä»¶æ·»å å¤çå¨ï¼æ³¨æåç§°ç大å°åä¸åï¼æ¥æè·æªå¤ççæç»ï¼å°±åè¿æ ·ï¼
process.on("unhandledRejection", (reason, promise) => {
/* ä½ å¯ä»¥å¨è¿éæ·»å ä¸äºä»£ç ï¼ä»¥ä¾¿æ£æ¥ promise å reason */
});
å¯¹äº Node.js æ¥è¯´ï¼ä¸ºäºé²æ¢é误被记å½å°æ§å¶å°ï¼å¦åé»è®¤ä¼åçï¼ï¼æ·»å process.on()
çå¬å¨å°±è¶³å¤äºï¼ä¸éè¦ç±»ä¼¼æµè§å¨è¿è¡æ¶ç preventDefault()
æ¹æ³è¿æ ·ççææä½ã
ç¶èï¼å¦æä½ æ·»å äº process.on
çå¬å¨ï¼ä½æ²¡æå¨å
¶ä¸æ·»å ä»£ç æ¥å¤ç被æç»ç Promiseï¼é£ä¹å®ä»¬å°±ä¼è¢«ä¸¢å¼ï¼èä¸ä¸ä¼æä»»ä½æç¤ºãå æ¤ï¼æå¥½å¨çå¬å¨ä¸æ·»å ä»£ç æ¥æ£æ¥æ¯ä¸ªè¢«æç»ç Promiseï¼å¹¶ç¡®ä¿å®ä»¬ä¸æ¯ç±äºä»£ç é误è导è´çã
æå个ç»åå·¥å
·å¯ç¨æ¥å¹¶å弿¥æä½ï¼Promise.all()
ãPromise.allSettled()
ãPromise.any()
å Promise.race()
ã
æä»¬å¯ä»¥åæ¶å¯å¨æææä½ï¼åçå¾ å®ä»¬å ¨é¨å®æï¼å°±åè¿æ ·ï¼
Promise.all([func1(), func2(), func3()]).then(([result1, result2, result3]) => {
/* ä½¿ç¨ result1ãresult2 å result3 */
});
妿æ°ç»ä¸çæä¸ª Promise 被æç»ï¼Promise.all()
å°±ä¼ç«å³æç»è¿åç Promiseï¼å¹¶ç»æ¢å
¶ä»æä½ãè¿å¯è½ä¼å¯¼è´ä¸äºæå¤çç¶ææè¡ä¸ºãPromise.allSettled()
æ¯å¦ä¸ä¸ªç»åå·¥å
·ï¼å®ä¼çå¾
æææä½å®æååå¤çè¿åç Promiseã
ææçè¿äºæ¹æ³é½æ¯å¹¶åè¿è¡ Promise çââä¸ç³»å Promise åæ¶å¯å¨ï¼è䏿¯å½¼æ¤çå¾ ãé¡ºåºæ§è¡ä¹æ¯å¯è½çï¼è¿éè¦ä¸äºå·§å¦ç JavaScript ææ®µï¼
[func1, func2, func3]
.reduce((p, f) => p.then(f), Promise.resolve())
.then((result3) => {
/* ä½¿ç¨ result3 */
});
å¨è¿ä¸ªä¾åä¸ï¼æä»¬ä½¿ç¨ reduce æä¸ä¸ªå¼æ¥å½æ°æ°ç»å为ä¸ä¸ª Promise é¾ãä¸é¢ç代ç çåäºï¼
Promise.resolve()
.then(func1)
.then(func2)
.then(func3)
.then((result3) => {
/* ä½¿ç¨ result3 */
});
æä»¬ä¹å¯ä»¥åæå¯å¤ç¨ç彿°å½¢å¼ï¼è¿å¨å½æ°å¼ç¼ç¨ä¸æä¸ºæ®éï¼
const applyAsync = (acc, val) => acc.then(val);
const composeAsync =
(...funcs) =>
(x) =>
funcs.reduce(applyAsync, Promise.resolve(x));
composeAsync()
彿°å°ä¼æ¥åä»»ææ°éç彿°ä½ä¸ºå
¶åæ°ï¼å¹¶è¿åä¸ä¸ªæ°ç彿°ï¼èè¯¥å½æ°åæ¥åä¸ä¸ªåå§å¼ï¼è¯¥ç»åçåæ°ä¼ é管线å¦ä¸æç¤ºï¼
const transformData = composeAsync(func1, func2, func3);
const result3 = transformData(data);
顺åºç»åè¿å¯ä»¥ä½¿ç¨ async/await æ´ç®æ´å°å®æï¼
let result;
for (const f of [func1, func2, func3]) {
result = await f(result);
}
/* ä½¿ç¨æåçç»æï¼å³ result3ï¼*/
ç¶èï¼å¨ä½ 顺åºç»å Promise åï¼è¯·èèæ¯å¦ççæå¿ è¦ââå 为å®ä»¬ä¼é»å¡å½¼æ¤ï¼é¤éä¸ä¸ª Promise çæ§è¡ä¾èµäºå¦ä¸ä¸ª Promise çç»æï¼å¦åæå¥½å¹¶åè¿è¡ Promiseã
卿§å¼åè° API ä¸å建 Promiseå¯ä»¥éè¿ Promise çæé 彿°ä»é¶å¼å§å建 Promise
ãè¿ç§æ¹å¼ï¼éè¿æé 彿°çæ¹å¼ï¼åºå½åªå¨å°è£
æ§ API çæ¶åç¨å°ã
çæ³ç¶æä¸ï¼ææç弿¥å½æ°åºè¯¥ä¼è¿å Promiseã使ä¸äº API ä»ç¶ä½¿ç¨æ§æ¹å¼æ¥ä¼ å
¥æåï¼æè
失败ï¼çåè°ãæå
¸åçä¾åå°±æ¯ setTimeout()
彿°ï¼
setTimeout(() => saySomething("10 ç§éè¿å»äº"), 10 * 1000);
æ··ç¨æ§å¼åè°å Promise å¯è½ä¼é æè¿è¡æ¶åºé®é¢ã妿 saySomething
彿°å¤±è´¥äºï¼æè
å
å«äºç¼ç¨é误ï¼é£å°±æ²¡æåæ³æè·å®äºãè¿å¾æª setTimeout()
ã
幸è¿å°æ¯ï¼æä»¬å¯ä»¥å° setTimeout()
å°è£
å
¥ Promise å
ãæå¥½çåæ³æ¯ï¼å°è¿äºæé®é¢ç彿°å°è£
èµ·æ¥ï¼çå¨åºå±ï¼å¹¶ä¸æ°¸è¿ä¸è¦åç´æ¥è°ç¨å®ä»¬ï¼
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
wait(10 * 1000)
.then(() => saySomething("10 ç§é"))
.catch(failureCallback);
é常ï¼Promise çæé 彿°æ¥æ¶ä¸ä¸ªæ§è¡å½æ°ï¼executorï¼ï¼æä»¬å¯ä»¥å¨è¿ä¸ªæ§è¡å½æ°éæå¨å°è§£å³ï¼resolveï¼ææç»ï¼rejectï¼ä¸ä¸ª Promiseãæ¢ç¶ setTimeout()
å¹¶ä¸ä¼ççæ§è¡å¤±è´¥ï¼é£ä¹æä»¬å¯ä»¥å¨è¿ç§æ
åµä¸å¿½ç¥æç»çæ
åµãä½ å¯ä»¥å¨ Promise()
åè䏿¥çæ´å¤å
³äºæ§è¡å½æ°çä¿¡æ¯ã
æåï¼æä»¬å°æ·±å ¥äºè§£æ´å¤ææ¯ç»èââå ³äºæ³¨åçåè°å½æ°ä½æ¶è¢«è°ç¨ã
ä¿è¯å¨åºäºåè°ç API ä¸ï¼åè°å½æ°ä½æ¶ä»¥åå¦ä½è¢«è°ç¨åå³äº API çå®ç°è ãä¾å¦ï¼åè°å¯è½æ¯åæ¥è°ç¨çï¼ä¹å¯è½æ¯å¼æ¥è°ç¨çï¼
function doSomething(callback) {
if (Math.random() > 0.5) {
callback();
} else {
setTimeout(() => callback(), 1000);
}
}
æä»¬é常ä¸å»ºè®®ä½¿ç¨ä¸è¿°è¿ç§è®¾è®¡ï¼å 为å®ä¼å¯¼è´æè°çâZalgo ç¶æâãå¨è®¾è®¡å¼æ¥ API çä¸ä¸æä¸ï¼è¿æå³çåè°å¨æäºæ åµä¸æ¯åæ¥è°ç¨çï¼ä½å¨å ¶ä»æ åµä¸æ¯å¼æ¥è°ç¨çï¼è¿ä¸ºè°ç¨è 带æ¥çæ§ä¹ãæ´å¤èæ¯ä¿¡æ¯ï¼è¯·åè§æç« ä¸ºå¼æ¥è®¾è®¡ APIï¼è¿æ¯è¯¥æ¯è¯é¦æ¬¡è¢«æ£å¼æåºçå°æ¹ãè¿ç§ API 设计使å¾å¯ä½ç¨é¾ä»¥åæï¼
let value = 1;
doSomething(() => {
value = 2;
});
console.log(value); // 1 è¿æ¯ 2ï¼
å¦ä¸æ¹é¢ï¼Promise æ¯ä¸ç§æ§å¶å转çå½¢å¼ââAPI çå®ç°è 䏿§å¶åè°ä½æ¶è¢«è°ç¨ãç¸åï¼ç»´æ¤åè°éåå¹¶å³å®ä½æ¶è°ç¨åè°çå·¥ä½è¢«å§æç»äº Promise çå®ç°è ï¼è¿æ ·ä¸æ¥ï¼API ç使ç¨è åå¼åè é½ä¼èªå¨è·å¾å¼ºå¤§çè¯ä¹ä¿è¯ï¼å æ¬ï¼
then()
çåè°æ°¸è¿ä¸ä¼å¨ JavaScript äºä»¶å¾ªç¯çå½åè¿è¡å®æä¹å被è°ç¨ãthen()
æ·»å çåè°å½æ°ä¹ä¼è¢«è°ç¨ãthen()
å¯ä»¥æ·»å å¤ä¸ªåè°å½æ°ï¼å®ä»¬ä¼æç
§æå
¥é¡ºåºè¿è¡æ§è¡ã以é²ä¸ä¸çæéï¼ä¼ å
¥ then()
ç彿°æ°¸è¿ä¸ä¼è¢«åæ¥è°ç¨ï¼å³ä½¿ Promise å·²ç»è¢«è§£å³äºï¼resolvedï¼ï¼
Promise.resolve().then(() => console.log(2));
console.log(1); // 1, 2
ä¼ å
¥ then()
ç彿°ä¸ä¼ç«å³è¿è¡ï¼èæ¯è¢«æ¾å
¥å¾®ä»»å¡éåä¸ï¼è¿æå³çå®ä¼å¨ç¨åè¿è¡ï¼ä»
å¨åå»ºè¯¥å½æ°ç彿°éåºåï¼ä¸ JavaScript æ§è¡å æ 为空æ¶ï¼ï¼ä¹å°±æ¯å¨æ§å¶æè¿åäºä»¶å¾ªç¯ä¹åãæ»èè¨ä¹ï¼ä¸ä¼çå¾
太ä¹
ï¼
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
wait().then(() => console.log(4));
Promise.resolve()
.then(() => console.log(2))
.then(() => console.log(3));
console.log(1); // 1, 2, 3, 4
ä»»å¡éå vs. 微任å¡
Promise åè°è¢«å¤ç为微任å¡ï¼è setTimeout()
åè°è¢«å¤ç为任å¡éåã
const promise = new Promise((resolve, reject) => {
console.log("Promise æ§è¡å½æ°");
resolve();
}).then((result) => {
console.log("Promise åè°ï¼.thenï¼");
});
setTimeout(() => {
console.log("æ°ä¸è½®äºä»¶å¾ªç¯ï¼Promiseï¼å·²å®æï¼", promise);
}, 0);
console.log("Promiseï¼éåä¸ï¼", promise);
ä¸è¿°ä»£ç çè¾åºå¦ä¸ï¼
Promise æ§è¡å½æ° Promiseï¼éåä¸ï¼Promise {<pending>} Promise åè°ï¼.thenï¼ æ°ä¸è½®äºä»¶å¾ªç¯ï¼Promiseï¼å·²å®æï¼Promise {<fulfilled>}
è¯¦è§æ·±å ¥ï¼å¾®ä»»å¡ä¸ Javascript è¿è¡æ¶ç¯å¢ã
å½ Promise ä¸ ä»»å¡å²çªæ¶ä½ å¯è½éå°å¦ä¸æ åµï¼ä½ çä¸äº Promise åä»»å¡ï¼ä¾å¦äºä»¶æåè°ï¼ä¼ä»¥ä¸å¯é¢æµç顺åºå¯å¨ãæ¤æ¶ï¼ä½ æè®¸å¯ä»¥éè¿ä½¿ç¨å¾®ä»»å¡æ£æ¥ç¶ææå¹³è¡¡ Promiseï¼å¹¶ä»¥æ¤ææ¡ä»¶å°å建 Promiseã
å¦æä½ è®¤ä¸ºå¾®ä»»å¡å¯è½ä¼å¸®å©ä½ è§£å³é®é¢ï¼é£ä¹è¯·é
è¯»å¾®ä»»å¡æåï¼å¦ä¹ å¦ä½ç¨ queueMicrotask()
æ¥å°ä¸ä¸ªå½æ°ä½ä¸ºå¾®ä»»å¡æ·»å å°éåä¸ã
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