Baseline Widely available
Promise.race()
éææ¹æ³æ¥åä¸ä¸ª promise å¯è¿ä»£å¯¹è±¡ä½ä¸ºè¾å
¥ï¼å¹¶è¿åä¸ä¸ª Promise
ãè¿ä¸ªè¿åç promise ä¼éç第ä¸ä¸ª promise çæ²å®èæ²å®ã
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, "one");
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "two");
});
Promise.race([promise1, promise2]).then((value) => {
console.log(value);
// Both resolve, but promise2 is faster
});
// Expected output: "two"
è¯æ³ åæ°
iterable
ä¸ä¸ª promise å¯è¿ä»£å¯¹è±¡ï¼ä¾å¦æ°ç»ï¼ã
ä¸ä¸ª Promise
ï¼ä¼ä»¥ iterable
ä¸ç¬¬ä¸ä¸ªæ²å®ç promise çç¶æå¼æ¥æ²å®ãæ¢å¥è¯è¯´ï¼å¦æç¬¬ä¸ä¸ªæ²å®ç promise 被å
ç°ï¼é£ä¹è¿åç promise ä¹ä¼è¢«å
ç°ï¼å¦æç¬¬ä¸ä¸ªæ²å®ç promise 被æç»ï¼é£ä¹è¿åç promise ä¹ä¼è¢«æç»ãå¦æä¼ å
¥ç iterable
为空ï¼è¿åç promise å°±ä¼ä¸ç´ä¿æå¾
å®ç¶æãå¦æä¼ å
¥ç iterable
é空ä½å
¶ä¸æ²¡æä»»ä½ä¸ä¸ª promise æ¯å¾
å®ç¶æï¼è¿åç promise ä»ä¼å¼æ¥æ²å®ï¼è䏿¯åæ¥æ²å®ï¼ã
Promise.race()
æ¹æ³æ¯ Promise å¹¶åæ¹æ³ä¹ä¸ãå½ä½ æ³è¦ç¬¬ä¸ä¸ªå¼æ¥ä»»å¡å®ææ¶ï¼ä½ä¸å
³å¿å®çæç»ç¶æï¼å³å®æ¢å¯ä»¥æåä¹å¯ä»¥å¤±è´¥ï¼æ¶ï¼å®å°±é常æç¨ã
妿å¯è¿ä»£å¯¹è±¡ä¸å
å«ä¸ä¸ªæå¤ä¸ªé promise å¼å/æå·²æ²å®ç promiseï¼å Promise.race()
å°ä»¥å¯è¿ä»£å¯¹è±¡ä¸æ¾å°ç第ä¸ä¸ªæ¤ç±»å¼æ²å®ã
è¿ä¸ªä¾åå±ç¤ºäºå¦ä½ä½¿ç¨ Promise.race()
æ¥æ¯è¾å¤ä¸ªä½¿ç¨ setTimeout()
å®ç°ç计æ¶å¨ãè®¡æ¶æ¶é´æçç计æ¶å¨æ»æ¯èµ¢å¾ç«æï¼å¹¶æä¸ºè¿åç promise ç¶æã
function sleep(time, value, state) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (state === "å
ç°") {
return resolve(value);
} else {
return reject(new Error(value));
}
}, time);
});
}
const p1 = sleep(500, "ä¸", "å
ç°");
const p2 = sleep(100, "äº", "å
ç°");
Promise.race([p1, p2]).then((value) => {
console.log(value); // âäºâ
// 两个é½ä¼å
ç°ï¼ä½ p2 æ´å¿«
});
const p3 = sleep(100, "ä¸", "å
ç°");
const p4 = sleep(500, "å", "æç»");
Promise.race([p3, p4]).then(
(value) => {
console.log(value); // âä¸â
// p3 æ´å¿«ï¼æä»¥å®å
ç°
},
(error) => {
// ä¸ä¼è¢«è°ç¨
},
);
const p5 = sleep(500, "äº", "å
ç°");
const p6 = sleep(100, "å
", "æç»");
Promise.race([p5, p6]).then(
(value) => {
// ä¸ä¼è¢«è°ç¨
},
(error) => {
console.error(error.message); // âå
â
// p6 æ´å¿«ï¼æä»¥å®æç»
},
);
Promise.race ç弿¥æ§
以ä¸ç¤ºä¾æ¼ç¤ºäº Promise.race
ç弿¥æ§ãä¸å
¶ä» promise å¹¶åæ¹æ³ä¸åï¼Promise.race
æ»æ¯å¼æ¥çï¼å³ä½¿ iterable
为空ï¼å®ä¹æ°¸è¿ä¸ä¼åæ¥å°å®æã
// ä¼ å
¥ä¸ä¸ªå·²ç»è§£å³ç Promise æ°ç»ï¼ä»¥å°½å¿«è§¦å Promise.raceã
const resolvedPromisesArray = [Promise.resolve(33), Promise.resolve(44)];
const p = Promise.race(resolvedPromisesArray);
// ç«å³æå° p çå¼
console.log(p);
// ä½¿ç¨ setTimeoutï¼æä»¬å¯ä»¥å¨å æ ä¸ºç©ºåæ§è¡ä»£ç
setTimeout(() => {
console.log("å æ ç°å¨ä¸ºç©º");
console.log(p);
});
// æé¡ºåºæå°ï¼
// Promise { <state>: "pending" }
// å æ ç°å¨ä¸ºç©º
// Promise { <state>: "fulfilled", <value>: 33 }
ä¸ä¸ªç©ºçå¯è¿ä»£å¯¹è±¡ä¼å¯¼è´è¿åç Promise ä¸ç´å¤äºå¾ å®ç¶æï¼
const foreverPendingPromise = Promise.race([]);
console.log(foreverPendingPromise);
setTimeout(() => {
console.log("å æ ç°å¨ä¸ºç©º");
console.log(foreverPendingPromise);
});
// æé¡ºåºæå°ï¼
// Promise { <state>: "pending" }
// å æ ç°å¨ä¸ºç©º
// Promise { <state>: "pending" }
妿å¯è¿ä»£å¯¹è±¡å
å«ä¸ä¸ªæå¤ä¸ªé Promise å¼å/æä¸ä¸ªå·²ç»æ²å®ç Promiseï¼å Promise.race
ä¼ä»¥æ°ç»ä¸æ¾å°ç第ä¸ä¸ªè¿æ ·ç弿²å®ï¼
const foreverPendingPromise = Promise.race([]);
const alreadyFulfilledProm = Promise.resolve(100);
const arr = [foreverPendingPromise, alreadyFulfilledProm, "é Promise å¼"];
const arr2 = [foreverPendingPromise, "é Promise å¼", Promise.resolve(100)];
const p = Promise.race(arr);
const p2 = Promise.race(arr2);
console.log(p);
console.log(p2);
setTimeout(() => {
console.log("å æ ç°å¨ä¸ºç©º");
console.log(p);
console.log(p2);
});
// æé¡ºåºæå°ï¼
// Promise { <state>: "pending" }
// Promise { <state>: "pending" }
// å æ ç°å¨ä¸ºç©º
// Promise { <state>: "fulfilled", <value>: 100 }
// Promise { <state>: "fulfilled", <value>: "é Promise å¼" }
ä½¿ç¨ Promise.race() å®ç°è¯·æ±è¶
æ¶
ä½ å¯ä»¥ä½¿ç¨ä¸ä¸ªå®æ¶å¨æ¥ä¸ä¸ä¸ªå¯è½æç»å¾é¿æ¶é´ç请æ±è¿è¡ç«äºï¼ä»¥ä¾¿è¶ åºæ¶é´éå¶æ¶ï¼è¿åç Promise èªå¨æç»ã
const data = Promise.race([
fetch("/api"),
new Promise((resolve, reject) => {
// 5 ç§åæç»
setTimeout(() => reject(new Error("请æ±è¶
æ¶")), 5000);
}),
])
.then((res) => res.json())
.catch((err) => displayError(err));
妿 data
Promise 被å
ç°ï¼å®å°å
å«ä» /api
è·åçæ°æ®ï¼å¦åï¼å¦æ fetch
ä¿æå¾
å®ç¶æå¹¶è¾ç» setTimeout
宿¶å¨ï¼è¿ä¸ª Promise å°å¨ 5 ç§å被æç»ã
ç±äº Promise.race()
è§£å³çå¯è¿ä»£å¯¹è±¡ä¸ç¬¬ä¸ä¸ªéå¾
å®ç¶æç Promiseï¼æä»¬å¯ä»¥æ£æ¥ä¸ä¸ª Promise çç¶æï¼å
æ¬å®æ¯å¦å¤äºå¾
å®ç¶æãè¿ä¸ªç¤ºä¾æ¯ä» promise-status-async
æ¹ç¼èæ¥çã
function promiseState(promise) {
const pendingState = { status: "å¾
å®" };
return Promise.race([promise, pendingState]).then(
(value) => (value === pendingState ? value : { status: "å·²å
ç°", value }),
(reason) => ({ status: "å·²æç»", reason }),
);
}
å¨è¿ä¸ªå½æ°ä¸ï¼å¦æ promise
æ¯å¾
å®ç¶æï¼é Promise ç±»åç第äºä¸ªå¼ pendingState
å°æä¸ºè¿ä¸ª race
çç»æï¼å¦åï¼å¦æ promise
å·²ç»æ²å®ï¼æä»¬å¯ä»¥éè¿ onFulfilled
å onRejected
å¤ç彿°æ¥ç¥éå®çç¶æãä¾å¦ï¼
const p1 = new Promise((res) => setTimeout(() => res(100), 100));
const p2 = new Promise((res) => setTimeout(() => res(200), 200));
const p3 = new Promise((res, rej) => setTimeout(() => rej(300), 100));
async function getStates() {
console.log(await promiseState(p1));
console.log(await promiseState(p2));
console.log(await promiseState(p3));
}
console.log("å¼å§ç¶æï¼");
getStates();
setTimeout(() => {
console.log("çå¾
100ms åï¼");
getStates();
}, 100);
// æå°ï¼
// å¼å§ç¶æï¼
// { status: 'å¾
å®' }
// { status: 'å¾
å®' }
// { status: 'å¾
å®' }
// çå¾
100ms åï¼
// { status: 'å·²å
ç°', value: 100 }
// { status: 'å¾
å®' }
// { status: 'å·²æç»', reason: 300 }
夿³¨ï¼ promiseState
彿°ä»ç¶æ¯å¼æ¥æ§è¡çï¼å 为没æåæ³åæ¥å°è·å Promise çå¼ï¼å³ä¸ä½¿ç¨ then()
æ await
ï¼ï¼å³ä½¿å®å·²ç»æ²å®ã使¯ï¼promiseState()
æ»æ¯å¨ä¸æ¬¡äºä»¶å¾ªç¯å
å°±ä¼å®æï¼å¹¶ä¸å®é
ä¸ä»ä¸çå¾
ä»»ä½ Promise çæ²å®ã
Promise.race
æ¹æ³ä»¥å¯è¿ä»£å¯¹è±¡ä¸ç¬¬ä¸ä¸ªæ²å®ç Promise
ä½ä¸ºæ²å®å¼ã
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, "ä¸");
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(reject, 100, "äº");
});
Promise.race([promise1, promise2])
.then((value) => {
console.log("æåï¼å¼ä¸ºï¼", value);
})
.catch((reason) => {
// åªæ promise1 æåå
ç°ï¼ä½ promise2 æ´å¿«
console.error("失败ï¼åå 为ï¼", reason);
});
// 失败ï¼åå 为ï¼äº
Promise.any
æ¹æ³ä»¥å¯è¿ä»£å¯¹è±¡ä¸ç¬¬ä¸ä¸ªè¢«å
ç°ç Promise
ä½ä¸ºå
ç°å¼ã
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, "ä¸");
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(reject, 100, "äº");
});
Promise.any([promise1, promise2])
.then((value) => {
// åªæ promise1 æåå
ç°ï¼å³ä½¿ promise2 æ´å¿«æ²å®
console.log("æåï¼å¼ä¸ºï¼", value);
})
.catch((reason) => {
console.error("失败ï¼åå 为ï¼", reason);
});
// æåï¼å¼ä¸ºï¼ä¸
è§è æµè§å¨å
¼å®¹æ§ åè§
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