Baseline Widely available
Promise
å®ä¾ç then()
æ¹æ³æå¤æ¥åä¸¤ä¸ªåæ°ï¼ç¨äº Promise
å
ç°åæç»æ
åµçåè°å½æ°ãå®ç«å³è¿åä¸ä¸ªçæç Promise
对象ï¼å
è®¸ä½ é¾æ¥å°å
¶ä» Promise æ¹æ³ï¼ä»èå®ç°é¾å¼è°ç¨ã
const promise1 = new Promise((resolve, reject) => {
resolve("Success!");
});
promise1.then((value) => {
console.log(value);
// Expected output: "Success!"
});
è¯æ³
then(onFulfilled)
then(onFulfilled, onRejected)
åæ°
onFulfilled
å¯é
ä¸ä¸ªå¨æ¤ Promise 对象被å
ç°æ¶å¼æ¥æ§è¡ç彿°ãå®çè¿åå¼å°æä¸º then()
è¿åç Promise 对象çå
ç°å¼ãæ¤å½æ°è¢«è°ç¨æ¶å°ä¼ å
¥ä»¥ä¸åæ°ï¼
value
Promise 对象çå ç°å¼ã
妿 onFulfilled
䏿¯ä¸ä¸ªå½æ°ï¼åå
é¨ä¼è¢«æ¿æ¢ä¸ºä¸ä¸ªæç彿°ï¼(x) => x
ï¼ï¼å®åªæ¯ç®åå°å°å
ç°å¼ååä¼ éã
onRejected
å¯é
ä¸ä¸ªå¨æ¤ Promise 对象被æç»æ¶å¼æ¥æ§è¡ç彿°ãå®çè¿åå¼å°æä¸º catch()
è¿åç Promise 对象çå
ç°å¼ãæ¤å½æ°è¢«è°ç¨æ¶å°ä¼ å
¥ä»¥ä¸åæ°ï¼
reason
Promise 对象被æç»çåå ã
妿 onRejected
䏿¯ä¸ä¸ªå½æ°ï¼åå
é¨ä¼è¢«æ¿æ¢ä¸ºä¸ä¸ªæåºå¨å½æ°ï¼(x) => { throw x; }
ï¼ï¼å®ä¼æåºå®æ¶å°çæç»åå ã
ç«å³è¿åä¸ä¸ªæ°ç Promise
对象ï¼è¯¥å¯¹è±¡å§ç»å¤äºå¾
å®ç¶æï¼æ 论å½å Promise 对象çç¶æå¦ä½ã
onFulfilled
å onRejected
å¤ç彿°ä¹ä¸å°è¢«æ§è¡ï¼ä»¥å¤çå½å Promise 对象çå
ç°ææç»ãå³ä½¿å½å Promise å¯¹è±¡å·²ç»æ²å®ï¼è¿ä¸ªè°ç¨ä¹æ»æ¯å¼æ¥åççãè¿åç Promise 对象ï¼ç§°ä¹ä¸º p
ï¼çè¡ä¸ºåå³äºå¤ç彿°çæ§è¡ç»æï¼éµå¾ªä¸ç»ç¹å®çè§åã妿å¤ç彿°ï¼
p
以该è¿åå¼ä½ä¸ºå
¶å
ç°å¼ãp
以 undefined
ä½ä¸ºå
¶å
ç°å¼ãp
æåºçé误ä½ä¸ºå
¶æç»å¼ãp
以该 Promise çå¼ä½ä¸ºå
¶å
ç°å¼ãp
以该 Promise çå¼ä½ä¸ºå
¶æç»å¼ãp
ä¿æå¾
å®ç¶æï¼å¹¶å¨è¯¥ Promise 对象被å
ç°/æç»åç«å³ä»¥è¯¥ Promise çå¼ä½ä¸ºå
¶å
ç°/æç»å¼ãthen()
æ¹æ³ç¨äºä¸º Promise 对象ç宿ï¼å
ç°ææç»ï¼è®¾ç½®åè°å½æ°ã宿¯ Promise çåºæ¬æ¹æ³ï¼thenable åè®®è¦æ±ææç±» Promise å¯¹è±¡é½æä¾ä¸ä¸ª then()
æ¹æ³ï¼å¹¶ä¸ catch()
å finally()
æ¹æ³é½ä¼éè¿è°ç¨è¯¥å¯¹è±¡ç then()
æ¹æ³æ¥å·¥ä½ã
æå
³ onRejected
å¤ç彿°çæ´å¤ä¿¡æ¯ï¼è¯·åé
catch()
åèææ¡£ã
then()
æ¹æ³è¿åä¸ä¸ªæ°ç Promise 对象ã妿å¨åä¸ Promise 对象ä¸ä¸¤æ¬¡è°ç¨ then()
æ¹æ³ï¼è䏿¯é¾å¼è°ç¨ï¼ï¼å该 Promise 对象å°å
·æä¸¤å¯¹å¤çæ¹æ³ãéå å°åä¸ Promise å¯¹è±¡çææå¤çæ¹æ³æ»æ¯æç
§å®ä»¬æ·»å ç顺åºè°ç¨ãæ¤å¤ï¼æ¯æ¬¡è°ç¨ then()
æ¹æ³è¿åç两个 Promise 对象å¼å§äºç¬ç«çé¾ï¼ä¸ä¼çå¾
å½¼æ¤çæ²å®ã
沿ç then()
é¾äº§çç thenable å¯¹è±¡æ»æ¯ä¼è¢«è§£å³ââonFulfilled
å¤ç彿°æ°¸è¿ä¸ä¼æ¶å° thenable 对象ï¼å¹¶ä¸ä»»ä½ç±å¤ç彿°è¿åç thenable 对象å¨ä¼ éç»ä¸ä¸ä¸ªå¤ç彿°ä¹åæ»æ¯è¢«è§£å³ãè¿æ¯å ä¸ºå¨æé æ°ç Promise 对象æ¶ï¼ç± executor
ä¼ éç resolve
å reject
彿°è¢«ä¿å䏿¥ï¼å¨å½å Promise 对象æ²å®æ¶ï¼ç¸åºç彿°å°è¢«è°ç¨ï¼å¹¶ä¼ éå
ç°å¼ææç»åå ãè§£å³é»è¾æ¥èª Promise()
æé 彿°ä¼ éçè§£å³å½æ°ã
then()
æ¹æ³æ¯æåç±»åï¼è¿æå³çå®å¯ä»¥å¨ Promise
åç±»çå®ä¾ä¸è°ç¨ï¼å¹¶ä¸ç»æå°æ¯å类类åç Promise 对象ãä½ å¯ä»¥éè¿ [Symbol.species]
屿§èªå®ä¹è¿åå¼ç±»åã
const p1 = new Promise((resolve, reject) => {
resolve("æåï¼");
// æ
// reject(new Error("é误!"));
});
p1.then(
(value) => {
console.log(value); // æåï¼
},
(reason) => {
console.error(reason); // é误ï¼
},
);
ä¼ å
¥é彿°ä½ä¸ºåæ°
Promise.resolve(1).then(2).then(console.log); // 1
Promise.reject(1).then(2, 2).then(console.log, console.log); // 1
é¾å¼è°ç¨
then
æ¹æ³è¿åä¸ä¸ªæ°ç Promise
ï¼ä»èå
许é¾å¼è°ç¨ã
妿ä½ä¸º then()
æ¹æ³çå¤ç彿°ä¼ éç彿°è¿åä¸ä¸ª Promise
ï¼åç¸åºç Promise
对象å°è¢«æ´é²ç»æ¹æ³é¾ä¸çåç» then()
æ¹æ³ãä¸é¢çä»£ç æ®µä½¿ç¨ setTimeout
彿°æ¥æ¨¡æå¼æ¥ä»£ç æä½ã
Promise.resolve("foo")
// 1. æ¥æ¶ "foo" å¹¶ä¸ "bar" æ¼æ¥ï¼å¹¶å°å
¶ç»æå为ä¸ä¸ä¸ª resolve è¿åã
.then(
(string) =>
new Promise((resolve, reject) => {
setTimeout(() => {
string += "bar";
resolve(string);
}, 1);
}),
)
// 2. æ¥æ¶ "foobar", æ¾å
¥ä¸ä¸ªå¼æ¥å½æ°ä¸å¤ç该å符串
// å¹¶å°å
¶æå°å°æ§å¶å°ä¸ï¼ä½æ¯ä¸å°å¤çåçå符串è¿åå°ä¸ä¸ä¸ªã
.then((string) => {
setTimeout(() => {
string += "baz";
console.log(string); // foobarbaz
}, 1);
return string;
})
// 3. æå°æ¬èä¸ä»£ç å°å¦ä½è¿è¡ç叮婿¶æ¯ï¼
// å符串å®é
䏿¯ç±ä¸ä¸ä¸ªåè°å½æ°ä¹åçé£å弿¥ä»£ç å¤ççã
.then((string) => {
console.log(
"æåä¸ä¸ª thenï¼ååâ¦â¦ä¹åæå¾å®ä¾åå¹¶è¿åä¸ä¸ª Promiseï¼æä»¥é¡ºåºå¯è½æç¹ä»¤äººæè®¶",
);
// 注æ `string` è¿æ¶ä¸ä¼åå¨ 'baz'ã
// å ä¸ºè¿æ¯åç卿们éè¿ setTimeout 模æç弿¥å½æ°ä¸ã
console.log(string); // foobar
});
// æé¡ºåºæå°ï¼
// æåä¸ä¸ª thenï¼ååâ¦â¦ä¹åæå¾å®ä¾åå¹¶è¿åä¸ä¸ª Promiseï¼æä»¥é¡ºåºå¯è½æç¹ä»¤äººæè®¶
// foobar
// foobarbaz
then()
æ¹æ³è¿åçå¼çè§£å³æ¹å¼ä¸ Promise.resolve()
ç¸åãè¿æå³çè¯¥æ¹æ³æ¯æ thenable 对象ï¼å¦æè¿åå¼ä¸æ¯ä¸ä¸ª Promise 对象ï¼åä¼éå¼å°å°å
¶å
è£
å¨ Promise
ä¸ï¼ç¶åè§£å³ã
const p2 = new Promise((resolve, reject) => {
resolve(1);
});
p2.then((value) => {
console.log(value); // 1
return value + 1;
}).then((value) => {
console.log(value, "- A synchronous value works"); // 2 - A synchronous value works
});
p2.then((value) => {
console.log(value); // 1
});
妿彿°æåºé误æè¿åä¸ä¸ªè¢«æç»ç Promiseï¼å then
è¿åç Promise æç»å°è¢«æç»ã
Promise.resolve()
.then(() => {
// 令 .then() è¿åä¸ä¸ªè¢«æç»ç promise
throw new Error("Oh no!");
})
.then(
() => {
console.log("ä¸ä¼è¢«è°ç¨ã");
},
(error) => {
console.error(`onRejected 彿°è¢«è°ç¨ï¼${error.message}`);
},
);
å¨å®è·µä¸ï¼é常æ´å¸æä½¿ç¨ catch()
æ¹æ³æ¥æè·è¢«æç»ç Promiseï¼è䏿¯ä½¿ç¨ then()
æ¹æ³ä¼ å
¥ä¸¤ä¸ªå¤çå¨çè¯æ³ï¼å¦ä¸ä¾æç¤ºã
Promise.resolve()
.then(() => {
// 令 .then() è¿åä¸ä¸ªè¢«æç»ç promise
throw new Error("å¢ï¼ä¸ï¼");
})
.catch((error) => {
console.error(`onRejected 彿°è¢«è°ç¨ï¼${error.message}`);
})
.then(() => {
console.log("å³ä½¿åé¢ç Promise 被æç»ï¼æä¹æ»æ¯ä¼è¢«è°ç¨");
});
å¨å
¶ä»æææ
åµä¸ï¼è¿åç Promise æç»é½ä¼è¢«å
ç°ãå¨ä¸é¢ç示ä¾ä¸ï¼å³ä½¿é¾ä¸çåä¸ä¸ª Promise 被æç»ï¼ç¬¬ä¸ä¸ª then()
è¿åä¸ä¸ªå
è£
ç 42
çå·²å
ç°ç Promiseã
Promise.reject()
.then(
() => 99,
() => 42,
) // onRejected è¿å 42ï¼å®è¢«å°è£
å¨å·²å
ç°ç Promise ä¸
.then((solution) => console.log(`å
ç°ä¸ºï¼${solution}`)); // å
ç°ä¸ºï¼42
妿 onFulfilled
è¿åä¸ä¸ª Promiseï¼é£ä¹ then
çè¿åå¼å°æ ¹æ®è¯¥ Promise çæç»ç¶æè¢«å
ç°æè¢«æç»ã
function resolveLater(resolve, reject) {
setTimeout(() => {
resolve(10);
}, 1000);
}
function rejectLater(resolve, reject) {
setTimeout(() => {
reject(new Error("é误"));
}, 1000);
}
const p1 = Promise.resolve("foo");
const p2 = p1.then(() => {
// æ¤å¤è¿åä¸ä¸ª Promiseï¼å°å¨ 1 ç§åè§£å³ä¸º 10
return new Promise(resolveLater);
});
p2.then(
(v) => {
console.log("已解å³", v); // "已解å³", 10
},
(e) => {
// ä¸ä¼è¢«è°ç¨
console.error("å·²æç»", e);
},
);
const p3 = p1.then(() => {
// æ¤å¤è¿åä¸ä¸ª Promiseï¼å°å¨ 1 ç§å以 'é误' 被æç»
return new Promise(rejectLater);
});
p3.then(
(v) => {
// ä¸ä¼è¢«è°ç¨
console.log("已解å³", v);
},
(e) => {
console.error("å·²æç»", e); // "å·²æç»", 'é误'
},
);
ä½ å¯ä»¥ä½¿ç¨é¾å¼è°ç¨ï¼å¨ä¸ä¸ªå½æ°ä¸å®ç°åºäº Promise ç APIï¼å¨å¦ä¸ä¸ªå½æ°ä¹ä¸ã
function fetchCurrentData() {
// fetch() API è¿åä¸ä¸ª Promiseã
// è¿ä¸ªå½æ°æä¾äºä¸ä¸ªç±»ä¼¼ç APIï¼ä½æ¯å®å¯¹ Promise çå
ç°å¼è¿è¡äºæ´å¤å¤ç
return fetch("current-data.json").then((response) => {
if (response.headers.get("content-type") !== "application/json") {
throw new TypeError();
}
const j = response.json();
// å¯ä»¥å¯¹ j è¿è¡ä¸äºå¤ç
// å
ç°å¼å°ä¼ä¼ éç» fetchCurrentData().then() ä¸çå¤ç彿°
return j;
});
}
then() ç弿¥æ§
以䏿¯ä¸ä¸ªç¤ºä¾ï¼ç¨äºæ¼ç¤º then
æ¹æ³ç弿¥æ§ã
// ç¨ä¸ä¸ªå·²è§£å³ç PromiseâââresolvedPromâ为ä¾ï¼
// 彿°è°ç¨âresolvedProm.then(...)âç«å³è¿åä¸ä¸ªæ°ç Promiseï¼
// 使¯å
¶ä¸çå¤çå¨â(value) => {...}âå°è¢«å¼æ¥è°ç¨ï¼æ£å¦æå°è¾åºæç¤ºã
// æ°ç Promise 被èµå¼ç»âthenPromâï¼
// å¹¶ä¸ thenProm å°è¢«è§£å³ä¸ºå¤ç彿°è¿åçå¼ã
const resolvedProm = Promise.resolve(33);
console.log(resolvedProm);
const thenProm = resolvedProm.then((value) => {
console.log(
`å¨ä¸»å æ ç»æå被è°ç¨ãæ¶å°ç弿¯ï¼${value}ï¼è¿åç弿¯ï¼${value + 1}`,
);
return value + 1;
});
console.log(thenProm);
// ä½¿ç¨ setTimeoutï¼æä»¬å¯ä»¥å°å½æ°çæ§è¡æ¨è¿å°è°ç¨æ ä¸ºç©ºçæ¶å»ã
setTimeout(() => {
console.log(thenProm);
});
// æé¡ºåºæå°ï¼
// Promise {[[PromiseStatus]]: "resolved", [[PromiseResult]]: 33}
// Promise {[[PromiseStatus]]: "pending", [[PromiseResult]]: undefined}
// "å¨ä¸»å æ ç»æå被è°ç¨ãæ¶å°ç弿¯ï¼33ï¼è¿åç弿¯ï¼34"
// Promise {[[PromiseStatus]]: "resolved", [[PromiseResult]]: 34}
è§è æµè§å¨å
¼å®¹æ§ åè§
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