假设有三个网络请求 A、B 和 C,它们的返回值分别为 "A"、"B" 和 "C",但由于网络延迟的原因,它们的返回顺序是不确定的。请使用 Promise.race() 实现一个函数,它在接收到任意一个请求的返回值后就停止所有请求并返回该值。
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
假设有三个网络请求 A、B 和 C,它们的返回值分别为 "A"、"B" 和 "C",但由于网络延迟的原因,它们的返回顺序是不确定的。请使用 Promise.race() 实现一个函数,它在接收到任意一个请求的返回值后就停止所有请求并返回该值。
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
使用 Promise.race
这个API,把所有网络请求 Promisify
之后都放入到一个数组当中,传递给 Promise.race
。
当其中有任意一个请求返回后, Promise.race
就会返回该请求返回的 Promise
对象,再通过调用 .then()
方法就可以获取到返回结果了。
例如说:
function test() {
Promise.race([
fetch('https://api.example.com/A'),
fetch('https://api.example.com/B'),
fetch('https://api.example.com/C')
]).then(res => {
console.log(res.result)
});
}
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
要使用
Promise.race()
实现一个函数,使得在接收到任意一个请求的返回值后就停止所有请求并返回该值,我们可以将每个请求与一个"取消请求"操作组合在一起。这里有一个示例实现:在这个示例中,我们首先创建了一个
fetchApi
函数来模拟网络请求。然后,我们定义了一个CancellationToken
类,它用于表示取消请求的信号。接着,我们创建了一个cancelableFetchApi
函数,它接收一个额外的参数cancellationToken
,用于检查请求是否已被取消。在
raceToFirstResponse
函数中,我们使用Promise.race()
等待所有请求的竞争,并在竞争结束后取消其他未完成的请求。这样,我们就实现了在接收到任意一个请求的返回值后停止所有请求并返回该值的功能。