likes
comments
collection
share

很妙的请求超时控制?分享 1 段优质 JS 代码片段!这段代码展示了如何通过 Promise.race 方法,来巧妙实现

作者站长头像
站长
· 阅读数 26

本内容首发于工粽号:程序员大澈,每日分享一段优质代码片段,欢迎关注和投稿!

大家好,我是大澈!

本文约 700+  字,整篇阅读约需 1 分钟。

今天分享一段优质 JS 代码片段,很秒的实现了对异步请求的超时控制。

老规矩,先阅读代码片段并思考,再看代码解析再思考,最后评论区留下你的见解!

// 如果在指定的毫秒数内未返回,则拒绝并显示“超时”错误
const timeout = (promise, ms) =>Promise.race([promise, newPromise((_, reject) => setTimeout(() => reject(newError("Timeout")), ms))]);

timeout(fetch("https://api.riki.wang"), 5000)
  .then(() =>"handleResponse")
  .catch(() =>"handleError");

分享原因

这段代码展示了如何通过 Promise.race 方法,来巧妙实现对异步操作的超时控制。

这在处理网络请求或其他可能耗时的操作时非常有用,可以避免长时间的等待导致的不良用户体验。

代码解析

1. Promise.race()

Promise.race() 方法是 JavaScript 中 Promise 对象的一个方法。

它用于并行执行多个 Promise 实例,并返回第一个完成(无论是成功完成还是失败拒绝)的 Promise 的结果,且其他 Promise 的结果会被忽略。

这里定义了一个名为 timeout 的函数,它接受一个 promise 对象和一个毫秒数 ms 作为参数。

在这个函数中,创建了一个新的 Promise ,它会在指定的 ms 毫秒后通过 reject 抛出一个 Timeout 错误。然后将这个新创建的 Promise 和传入的 promise 一起传递给 Promise.race 。

2. timeout(fetch, 5000)

调用 timeout 函数,并将 fetch 操作 和 超时时间 5000 毫秒作为参数传入。

如果在 5000 毫秒内 fetch 操作完成,就会进入 then 回调,执行 "handleResponse" 。

如果在 5000 毫秒内 fetch 操作未完成,那么由 setTimeout 创建的 Promise 会抛出 Timeout 错误,导致进入 catch 回调,执行 "handleError" 。

转载自:https://juejin.cn/post/7403564345549963299
评论
请登录