Baseline Widely available
Promise.all()
éææ¹æ³æ¥åä¸ä¸ª Promise å¯è¿ä»£å¯¹è±¡ä½ä¸ºè¾å
¥ï¼å¹¶è¿åä¸ä¸ª Promise
ã彿æè¾å
¥ç Promise é½è¢«å
ç°æ¶ï¼è¿åç Promise ä¹å°è¢«å
ç°ï¼å³ä½¿ä¼ å
¥çæ¯ä¸ä¸ªç©ºçå¯è¿ä»£å¯¹è±¡ï¼ï¼å¹¶è¿åä¸ä¸ªå
嫿æå
ç°å¼çæ°ç»ã妿è¾å
¥çä»»ä½ Promise 被æç»ï¼åè¿åç Promise å°è¢«æç»ï¼å¹¶å¸¦æç¬¬ä¸ä¸ªè¢«æç»çåå ã
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "foo");
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// Expected output: Array [3, 42, "foo"]
è¯æ³ åæ° è¿åå¼
ä¸ä¸ª Promise
ï¼å
¶ç¶æä¸ºï¼
iterable
为空ãiterable
䏿æç promise é½å·²å
ç°ãå
ç°å¼æ¯ä¸ä¸ªæ°ç»ï¼å
¶å
ç´ é¡ºåºä¸ä¼ å
¥ç promise ä¸è´ï¼èéæç
§å
ç°çæ¶é´é¡ºåºæåãå¦æä¼ å
¥ç iterable
æ¯ä¸ä¸ªé空ä½ä¸å
å«å¾
å®çï¼pendingï¼promiseï¼åè¿åç promise ä¾ç¶æ¯å¼æ¥å
ç°ï¼èé忥å
ç°ãiterable
ä¸çä»»æ promise 被æç»ãæç»åå æ¯ç¬¬ä¸ä¸ªæç»ç promise çæç»åå ãPromise.all()
æ¹æ³æ¯ promise å¹¶åæ¹æ³ä¹ä¸ãå®å¯ç¨äºèåå¤ä¸ª Promise çç»æãé叏卿å¤ä¸ªç¸å
³ç弿¥ä»»å¡å¹¶ä¸æ´ä¸ªä»£ç ä¾èµäºè¿äºä»»å¡æå宿æ¶ä½¿ç¨ï¼æä»¬å¸æå¨ä»£ç æ§è¡ç»§ç»ä¹å宿ææä»»å¡ã
Promise.all()
æ¹æ³ä¼å¨ä»»ä½ä¸ä¸ªè¾å
¥ç Promise 被æç»æ¶ç«å³æç»ãç¸æ¯ä¹ä¸ï¼Promise.allSettled()
æ¹æ³è¿åç Promise ä¼çå¾
ææè¾å
¥ç Promise 宿ï¼ä¸ç®¡å
¶ä¸æ¯å¦æ Promise 被æç»ãå¦æä½ éè¦è·åè¾å
¥å¯è¿ä»£å¯¹è±¡ä¸æ¯ä¸ª Promise çæç»ç»æï¼ååºä½¿ç¨ allSettled()
æ¹æ³ã
Promise.all
çå¾
ææå
ç°ï¼æç¬¬ä¸ä¸ªæç»ï¼çç»æã
const p1 = Promise.resolve(3);
const p2 = 1337;
const p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("foo");
}, 100);
});
Promise.all([p1, p2, p3]).then((values) => {
console.log(values); // [3, 1337, "foo"]
});
妿 iterable
å
å«é promise å¼ï¼è¿äºå¼å°è¢«å¿½ç¥ï¼ä½ä»å
å«å¨è¿åç promise æ°ç»å¼ä¸ï¼å¦æè¯¥ promise å¾å°äºå
ç°ï¼ï¼
// ææçå¼é½ä¸æ¯ Promiseï¼å æ¤è¿åç Promise å°è¢«å
ç°
const p = Promise.all([1, 2, 3]);
// è¾å
¥ä¸å¯ä¸ç Promise å·²ç»è¢«å
ç°ï¼å æ¤è¿åç Promise å°è¢«å
ç°
const p2 = Promise.all([1, 2, 3, Promise.resolve(444)]);
// ä¸ä¸ªï¼ä¹æ¯å¯ä¸çä¸ä¸ªï¼è¾å
¥ Promise 被æç»ï¼å æ¤è¿åç Promise å°è¢«æç»
const p3 = Promise.all([1, 2, 3, Promise.reject(555)]);
// ä½¿ç¨ setTimeoutï¼æä»¬å¯ä»¥å¨éåä¸ºç©ºåæ§è¡ä»£ç
setTimeout(() => {
console.log(p);
console.log(p2);
console.log(p3);
});
// æå°ï¼
// Promise { <state>: "fulfilled", <value>: Array[3] }
// Promise { <state>: "fulfilled", <value>: Array[4] }
// Promise { <state>: "rejected", <reason>: 555 }
Promise.all ç弿¥æ§å忥æ§
以ä¸ç¤ºä¾æ¼ç¤ºäºå¨ä¼ éé空ç iterable
æ¶ Promise.all
ç弿¥æ§ï¼
// ä¼ å
¥ä¸ä¸ªå·²ç» resolved ç Promise æ°ç»ï¼ä»¥å°½å¯è½å¿«å°è§¦å Promise.all
const resolvedPromisesArray = [Promise.resolve(33), Promise.resolve(44)];
const p = Promise.all(resolvedPromisesArray);
// ç«å³æå° p çå¼
console.log(p);
// ä½¿ç¨ setTimeoutï¼æä»¬å¯ä»¥å¨éåä¸ºç©ºåæ§è¡ä»£ç
setTimeout(() => {
console.log("éåç°å¨ä¸ºç©º");
console.log(p);
});
// æé¡ºåºæå°ï¼
// Promise { <state>: "pending" }
// éåç°å¨ä¸ºç©º
// Promise { <state>: "fulfilled", <value>: Array[2] }
妿 Promise.all
失败ï¼ä¹æ¯ä¸æ ·çï¼
const mixedPromisesArray = [Promise.resolve(33), Promise.reject(44)];
const p = Promise.all(mixedPromisesArray);
console.log(p);
setTimeout(() => {
console.log("éåç°å¨ä¸ºç©º");
console.log(p);
});
// Logs:
// Promise { <state>: "pending" }
// éåç°å¨ä¸ºç©º
// Promise { <state>: "rejected", <reason>: 44 }
åªæå½ä¼ éç» Promise.all
ç iterable
为空æ¶ï¼Promise.all
æä¼åæ¥è§£å³ã
const p = Promise.all([]); // å°ä¼ç«å³è§£å³
const p2 = Promise.all([1337, "hi"]); // é promise å¼å°è¢«å¿½ç¥ï¼ä½æ±å¼æ¯å¼æ¥è¿è¡ç
console.log(p);
console.log(p2);
setTimeout(() => {
console.log("éåç°å¨ä¸ºç©º");
console.log(p2);
});
// Logs:
// Promise { <state>: "fulfilled", <value>: Array[0] }
// Promise { <state>: "pending" }
// éåç°å¨ä¸ºç©º
// Promise { <state>: "fulfilled", <value>: Array[2] }
å° Promise.all() ä¸å¼æ¥å½æ°ä¸èµ·ä½¿ç¨
å¨ async 彿°ä¸ï¼âè¿åº¦ awaitâ代ç é常æ®éãä¾å¦ï¼ç»å®ä»¥ä¸å½æ°ï¼
function promptForDishChoice() {
return new Promise((resolve, reject) => {
const dialog = document.createElement("dialog");
dialog.innerHTML = `
<form method="dialog">
<p>What would you like to eat?</p>
<select>
<option value="pizza">Pizza</option>
<option value="pasta">Pasta</option>
<option value="salad">Salad</option>
</select>
<menu>
<li><button value="cancel">Cancel</button></li>
<li><button type="submit" value="ok">OK</button></li>
</menu>
</form>
`;
dialog.addEventListener("close", () => {
if (dialog.returnValue === "ok") {
resolve(dialog.querySelector("select").value);
} else {
reject(new Error("User cancelled dialog"));
}
});
document.body.appendChild(dialog);
dialog.showModal();
});
}
async function fetchPrices() {
const response = await fetch("/prices");
return await response.json();
}
ä½ å¯è½ä¼åä¸ä¸ªåä¸é¢è¿æ ·ç彿°ï¼
async function getPrice() {
const choice = await promptForDishChoice();
const prices = await fetchPrices();
return prices[choice];
}
ç¶èï¼è¯·æ³¨æï¼promptForDishChoice
å fetchPrices
çæ§è¡ä¸ä¾èµäºå½¼æ¤çç»æãå½ç¨æ·éæ©ä»ä»¬çèè´æ¶ï¼å¯ä»¥å¨åå°è·åä»·æ ¼ï¼ä½æ¯å¨ä¸é¢ç代ç ä¸ï¼await
è¿ç®ç¬¦ä¼å¯¼è´å¼æ¥å½æ°æåï¼ç´å°éæ©å®æï¼ç¶å忬¡æåï¼ç´å°è·åå°ä»·æ ¼ãæä»¬å¯ä»¥ä½¿ç¨ Promise.all
å¹¶åå°è¿è¡å®ä»¬ï¼ä»¥ä¾¿ç¨æ·å¨ç»æç»åºä¹åä¸å¿
çå¾
è·åä»·æ ¼ï¼
async function getPrice() {
const [choice, prices] = await Promise.all([
promptForDishChoice(),
fetchPrices(),
]);
return prices[choice];
}
Promise.all
å¨è¿éæ¯å¹¶åæ¹æ³ä¸çæä½³éæ©ï¼å 为é误å¤çå¾ç´è§ââ妿æä»»ä½ä¸ä¸ª Promise 被æç»ï¼ç»æå°ä¸åå¯ç¨ï¼æ´ä¸ª await
表达å¼ä¼æåºå¼å¸¸ã
Promise.all
æ¥åä¸ä¸ª Promise å¯è¿ä»£å¯¹è±¡ï¼å æ¤å¦æè¦ä½¿ç¨å®æ¥å¹¶è¡æ§è¡å¤ä¸ªå¼æ¥å½æ°ï¼ä½ éè¦è°ç¨è¿äºå¼æ¥å½æ°å¹¶ä½¿ç¨è¿åç Promiseãç´æ¥å°å½æ°ä¼ éç» Promise.all
æ¯ä¸èµ·ä½ç¨çï¼å 为å®ä»¬ä¸æ¯ Promiseã
async function getPrice() {
const [choice, prices] = await Promise.all([
promptForDishChoice,
fetchPrices,
]);
// `choice` å `prices` ä»ç¶æ¯åå§ç弿¥å½æ°ï¼
// Promise.all() 对é Promise ä¸èµ·ä½ç¨
}
Promise.all çå¿«é失败è¡ä¸º
Promise.all
å¨ä»»æä¸ä¸ªä¼ å
¥ç promise 失败æ¶è¿å失败ãä¾å¦ï¼å¦æä½ ä¼ å
¥å个è¶
æ¶åè§£å³ç promise åä¸ä¸ªç«å³æç»ç promiseï¼é£ä¹ Promise.all
å°ç«å³è¢«æç»ã
const p1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("ä¸"), 1000);
});
const p2 = new Promise((resolve, reject) => {
setTimeout(() => resolve("äº"), 2000);
});
const p3 = new Promise((resolve, reject) => {
setTimeout(() => resolve("ä¸"), 3000);
});
const p4 = new Promise((resolve, reject) => {
setTimeout(() => resolve("å"), 4000);
});
const p5 = new Promise((resolve, reject) => {
reject(new Error("æç»"));
});
// ä½¿ç¨ .catch:
Promise.all([p1, p2, p3, p4, p5])
.then((values) => {
console.log(values);
})
.catch((error) => {
console.error(error.message);
});
// æå°ï¼
// "æç»"
éè¿å¤çå¯è½çæç»ï¼å¯ä»¥æ´æ¹æ¤è¡ä¸ºï¼
const p1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("p1 å»¶è¿è§£å³"), 1000);
});
const p2 = new Promise((resolve, reject) => {
reject(new Error("p2 ç«å³æç»"));
});
Promise.all([p1.catch((error) => error), p2.catch((error) => error)]).then(
(values) => {
console.log(values[0]); // "p1 å»¶è¿è§£å³"
console.error(values[1]); // "Error: p2 ç«å³æç»"
},
);
è§è æµè§å¨å
¼å®¹æ§ åè§
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