在JavaScript中解释Promise.race()与async-await
我们将在本教程中学习Promise.race()方法。正如race()方法的名字所示,作为race()方法的参数传递的承诺会做比赛执行。
因此,无论哪个承诺先被解决,都将只由race()方法执行,而其他承诺将永远不会被执行。
Promise.race()
JavaScript中的Promise.race方法允许你等待一组承诺中的第一个被履行或拒绝,并处理发生的结果或错误。只要有一个输入的承诺被履行或拒绝,它就会返回一个被履行或拒绝的承诺,以及该承诺的值或原因。
用户可以按照下面的语法,使用promise.race()方法来执行第一个已解决的承诺。
Promise.race(iterable).then((response) => {
// handle response
});
在上面的语法中,Promise.race()方法将iterable作为第一个参数,我们可以在’then’块中处理成功执行的承诺的响应。
这里iterable采取可迭代的对象,比如一个承诺数组,以执行其中的任何承诺,哪个先结算。
语法
下面是你如何在JavaScript中使用Promise.race方法和async-await的语法。
async function example() {
try {
const result = await Promise.race([promise1, promise2, ...]);
} catch (error) {
// handle error
}
}
这里,promise1 ,promise2 ,等等是你要等待的承诺。Promise.race方法返回一个被解决或被拒绝的承诺,该承诺带有第一个被解决或被拒绝的输入承诺的值或原因。
异步函数的例子使用try/catch语句来处理错误情况,如果任何输入承诺被拒绝,catch块将被执行。
示例 1
在这个例子中,我们创建了多个承诺,并在承诺中设置了定时器来解决或拒绝这些承诺。我们把承诺的数组作为race()方法的参数传递给它。
输出显示,race()方法执行了被拒绝的承诺,因为它没有定时器。所以,race()方法执行的是第一个承诺,它被提前履行了,即使被拒绝或解决。
<html>
<body>
<h2>Using the Promise.race() </i> Method </h2>
<div id="output"></div>
<script>
let promise_1 = new Promise((res, rej) => {
setTimeout(() => {
res("Resolved promise with time of 0 milliseconds");
}, 1000);
});
let promise_2 = new Promise((res, rej) =>
rej("This promise is rejected!")
);
let promise_3 = new Promise((res, rej) => {
setTimeout(() => {
res("Resolved promise with time of 2000 milliseconds");
}, 2000);
});
Promise.race([promise_1, promise_2, promise_3]).then(
(response) => {
document.getElementById("output").innerHTML +=
"Promise resolved successfully.";
},
(error) => {
document.getElementById("output").innerHTML += "Promise rejected";
}
);
</script>
</body>
</html>
示例 2
在这个例子中,我们采用了不同的API,并使用fetch方法做了一个承诺。我们有一个名为request的许诺数组。
我们使用race()方法来解决所有的请求,无论哪个承诺将首先解决,我们都在’then’块内打印出URL。
<html>
<body>
<h2>Using Promise.race() Method with async-await</h2>
<div id = "output"> </div>
<button onclick = "executeRace()"> Fetch data from early promise </button>
<script>
async function executeRace() {
// array of different promises
const requests = [
fetch("https://api.publicapis.org/entries"),
fetch("https://catfact.ninja/fact"),
fetch("https://api.coindesk.com/v1/bpi/currentprice.json"),
];
// resolving the promises using the race() method
const res = await Promise.race(requests);
document.getElementById("output").innerHTML +=
"The first promise resolve is " + res.url;
}
</script>
</body>
</html>
当用户需要使用第一个已解决的承诺的响应时,可以使用race()方法,即使是被拒绝或被解决。如果用户需要使用第一个成功解决的承诺的结果,他们应该使用 promise.any()方法。