Promise
æ¯ä¸å表示é忥éç®çæçµå®ææå¤±æçç©ä»¶ãç±æ¼å¤æ¸äººä½¿ç¨é 建ç«ç Promiseï¼éåå°è¦½æå
è¬è§£åå³ Promise çä½¿ç¨æ¹å¼ï¼ä¹å¾åä»ç´¹å¦ä½å»ºç«ã
åºæ¬ä¸ï¼ä¸å Promise æ¯ä¸åæ ¹æéå 給ä»ç Callback åå³çç©ä»¶ï¼ä»¥å代å³é Callback å°éå彿¸ã
èä¾ä¾èªªï¼ä¸æ¹çç¯ä¾è¥ç¨èæ¹å¼æè©²ææå ©å Callbackï¼ä¸¦æ ¹ææåæå¤±æä¾æ±ºå®ä½¿ç¨åªåï¼
function successCallback(result) {
console.log("It succeeded with " + result);
}
function failureCallback(error) {
console.log("It failed with " + error);
}
doSomething(successCallback, failureCallback);
èæ°ä½æ³æåå³ä¸å Promiseï¼éæ¨£ä½ å°±å¯ä»¥éå Callbackï¼
let promise = doSomething();
promise.then(successCallback, failureCallback);
åç°¡å®é»ï¼
doSomething().then(successCallback, failureCallback);
æå稱ä¹çº é忥彿¸å¼å«ãéååæ³æè¨±å¤å¥½èï¼æåæ¥ä¸ä¾ççã
ä¿èä¸å¦èåæ³ï¼ä¸å Promise æéäºä¿èï¼
ä½ Promise 主è¦çç«å³å¥½èæ¯ä¸²é£ã
䏲飿å常è¦çéæ±æ¯ä¾åºå¼å«å ©å以ä¸çé忥彿¸ï¼æå稱ä¹çºå»ºç« Promise éã
ççéè¡ï¼then
彿¸åå³ä¸åæ°ç Promiseï¼ä¸åæ¼åæ¬ã
let promise = doSomething();
let promise2 = promise.then(successCallback, failureCallback);
æ
let promise2 = doSomething().then(successCallback, failureCallback);
第äºå Promise ä¸åªä»£è¡¨ doSomething()
宿ï¼éæsuccessCallback
æ failureCallback
ï¼éå
©åé忥彿¸åå³å¦ä¸å Promiseã妿¤ä¸ä¾ï¼ä»»ä½ Callback éå 給 promise2
æè¢«æå¨ successCallback
æfailureCallback
ä¹å¾ã
åºæ¬ä¸ï¼æ¯å Promise 代表èéä¸å¦å¤ä¸åé忥彿¸ç宿ã
å¨å¤æåï¼å¤åé忥彿¸æä½¿ç¨ Callback æ¹å¼ï¼å°è´æ³¢åæ³åé¡ï¼
doSomething(function (result) {
doSomethingElse(
result,
function (newResult) {
doThirdThing(
newResult,
function (finalResult) {
console.log("Got the final result: " + finalResult);
},
failureCallback,
);
},
failureCallback,
);
}, failureCallback);
æäºæ°æ¹æ³ï¼æåéå Callback å°åå³ç Promise ä¸ï¼ä¾è£½é Promise éï¼
doSomething()
.then(function (result) {
return doSomethingElse(result);
})
.then(function (newResult) {
return doThirdThing(newResult);
})
.then(function (finalResult) {
console.log("Got the final result: " + finalResult);
})
.catch(failureCallback);
then
ç彿¸æ¯é¸ç¨çï¼ä»¥å catch(failureCallback)
æ¯ then(null, failureCallback)
ç簡寫ãä½ ä¹è¨±ææ³ç¨ç®é 彿¸å代ï¼
doSomething()
.then((result) => doSomethingElse(result))
.then((newResult) => doThirdThing(newResult))
.then((finalResult) => {
console.log(`Got the final result: ${finalResult}`);
})
.catch(failureCallback);
注æï¼æ°¸é è¦åå³çµæï¼å¦å Callback 䏿ç²å¾åä¸å Promise ççµæã
ç²é¯å¾ä¸²æ¥å¤±æå¾çä¸²æ¥æ¯å¯è¡çï¼ä¹å°±æ¯èªª catch
æé常好ç¨ï¼å³ä½¿éä¸åºé¯ãççéåç¯ä¾ï¼
new Promise((resolve, reject) => {
console.log("Initial");
resolve();
})
.then(() => {
throw new Error("Something failed");
console.log("Do this");
})
.catch(() => {
console.log("Do that");
})
.then(() => {
console.log("Do this whatever happened before");
});
ä»æè¼¸åºï¼
Initial Do that Do this whatever happened before
注æãDo thisãæ²æè¢«è¼¸åºï¼å çºãSomething failedãé¯èª¤å°è´æçµã
é¯èª¤å³é卿³¢åæ³çæ³ä¸ï¼ä½ å¯è½æçå°ä¸æ¬¡ failureCallback
ï¼å¨ Promise éä¸åªéè¦å¨å°¾ç«¯ä½¿ç¨ä¸æ¬¡ï¼
doSomething()
.then((result) => doSomethingElse(result))
.then((newResult) => doThirdThing(newResult))
.then((finalResult) => console.log(`Got the final result: ${finalResult}`))
.catch(failureCallback);
åºæ¬ä¸ï¼ä¸å Promise ééå°é¯èª¤ææå¾ä¸å°æ¾ Catch èçå¨ã鿝ç¶é模çµåçé忥ç¨å¼ï¼
try {
let result = syncDoSomething();
let newResult = syncDoSomethingElse(result);
let finalResult = syncDoThirdThing(newResult);
console.log(`Got the final result: ${finalResult}`);
} catch (error) {
failureCallback(error);
}
å¨ ECMAScript 2017 ä¸ï¼å¨æ async
/await
èªæ³ç³ç忥ç¨å¼éå°é«å³°ï¼
async function foo() {
try {
let result = await doSomething();
let newResult = await doSomethingElse(result);
let finalResult = await doThirdThing(newResult);
console.log(`Got the final result: ${finalResult}`);
} catch (error) {
failureCallback(error);
}
}
éåºæ¼ Promiseï¼ä¾å¦ doSomething()
åä¹å䏿¨£ãä½ å¯ä»¥é±è®å¨é裡é±è®æ´å¤ã
Promise èç±ææææé¯èª¤ï¼å å«ä¾å¤åç¨å¼é¯èª¤ï¼è§£æ±ºäº Callback å°çç缺é»ã鿝é忥éç®çåºæ¬ç¹æ§ã
å¨èæ API ä¸å»ºç« PromisePromise
å¯ä»¥éé建æ§å建ç«ãæä»¥ç¨å»ºæ§åå
裹èç API å³å¯ã
å¨çæ³æ
æ³ï¼ææé忥彿¸é½æåå³ Promiseï¼ç¶èè¨±å¤ API ä»ç¶ç¨èçæ¹å¼ä¾å³éæåã失æ Callbackï¼æåå
¸åçä¾åæ¯setTimeout()
ï¼
setTimeout(() => saySomething("10 seconds passed"), 10000);
æ··åå¤ä»£ Callback å Promise æ¯æåé¡çã妿 saySomething
å¤±æææç¨å¼é¯èª¤ï¼é£ä¸ææä»»ä½é¯èª¤è¢«ææã
幸éå°ï¼æåå¯ä»¥ç¨ Promise å 裹ä»ï¼æå¥½ç¡å¯è½ç卿åºå±¤å 裹ï¼ä¸¦æ°¸é ä¸è¦åç´æ¥å¼å«ä»åï¼
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
wait(10000)
.then(() => saySomething("10 seconds"))
.catch(failureCallback);
åºæ¬ä¸ï¼Promise 建æ§åéè¦ä¸åéä½å½æ¸ä¾æ£è¦å°èçææçµ Promiseãä½å çº setTimeout
䏿失æï¼æä»¥æåæ¨æ£ rejectã
Promise.resolve()
å Promise.reject()
æ¯ç¨ä¾æ£è¦å°å»ºç«å·²ç¶èçææçµç Promiseãä»åå¨æäºæ
æ³ç¹å¥æç¨ã
Promise.all()
å Promise.race()
æ¯å
©åçµåå·¥å
·ç¨æ¼ä½¿ Promise å¹³è¡éä½ã
é£çºéè¯æ¯å¯è¡çï¼éæ¯æ¥µç°¡ JavaScript ç¯ä¾ï¼
[func1, func2].reduce((p, f) => p.then(f), Promise.resolve());
åºæ¬ä¸ï¼æåæºçï¼Reduceï¼ä¸åé忥彿¸é£åæä¸å Promise éï¼Promise.resolve().then(func1).then(func2);
éå¯ä»¥ç¨å¯éç¨çæ§æå½æ¸å®æï¼é常ç¨å½æ¸å¼ç·¨ç¨ï¼
let applyAsync = (acc, val) => acc.then(val);
let composeAsync =
(...funcs) =>
(x) =>
funcs.reduce(applyAsync, Promise.resolve(x));
composeAsync
æ¥å任使¸éç彿¸ä½çºåæ¸ï¼ä¸¦åå³ä¸åæ¥åä¸ååå§å¼ç¨ä¾å³çµ¦çµåçæ°å½æ¸ãéåå¥½èæ¯ç¡è«å
¶ä¸å½æ¸æ¯é忥æå¦ï¼é½æä¿èç¨æ£ç¢ºçé åºå·è¡ï¼
let transformData = composeAsync(func1, asyncFunc1, asyncFunc2, func2);
transformData(data);
ECMAScript 2017 ä¸é£çºçµåå©ç¨ async/await æ´ç°¡å®ï¼
for (let f of [func1, func2]) {
await f();
}
è¨æ
çºäºé¿å
æå¤ï¼å³çµ¦ then
ç彿¸ä¸æè¢«åæ¥å°å¼å«ï¼å³ä½¿æ¯å®æç Promiseï¼
Promise.resolve().then(() => console.log(2));
console.log(1); // 1, 2
被å³å ¥ç彿¸æè¢«æ¾å¨åä»»åä½åèéç«å³å·è¡ï¼å æ¤ä»æå¨ç¶åçäºä»¶è¿´åçµæãä½åæ¸ ç©ºæå·è¡ï¼ä¾å¦ï¼
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
çæ´å¤
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