用Promise.race()实现超时控制的代码示例

简介: 用Promise.race()实现超时控制的代码示例

下面是使用 Promise.race() 实现超时控制的代码示例,这个示例模拟了一个可能超时的异步操作(如网络请求),并在超时后触发错误处理:

// 1. 模拟一个实际的异步操作(例如接口请求)
function fetchData() {
  return new Promise((resolve) => {
    // 模拟网络请求延迟(这里设置为3秒,用于测试是否超时)
    setTimeout(() => {
      resolve("操作成功:获取到数据 { id: 1, name: '示例数据' }");
    }, 3000);
  });
}

// 2. 创建一个超时控制器
function createTimeoutController(timeoutMs, timeoutMsg) {
  return new Promise((_, reject) => {
    // 设定超时时间,超时后触发reject
    setTimeout(() => {
      reject(new Error(`超时:${timeoutMsg}(${timeoutMs}ms后)`));
    }, timeoutMs);
  });
}

// 3. 使用Promise.race()实现超时控制
function fetchDataWithTimeout(timeoutMs = 5000) {
  // 竞速:实际操作 vs 超时控制器
  return Promise.race([
    fetchData(), // 实际要执行的异步操作
    createTimeoutController(timeoutMs, "数据请求未在规定时间内完成") // 超时控制
  ]);
}

// 4. 使用带超时控制的异步操作
fetchDataWithTimeout(4000) // 设置超时时间为4秒
  .then((result) => {
    console.log("成功处理:", result);
    // 输出:成功处理:操作成功:获取到数据 { id: 1, name: '示例数据' }
    // (因为3秒的请求耗时 < 4秒超时时间)
  })
  .catch((error) => {
    console.error("错误处理:", error.message);
    // 如果将超时时间设为2000ms,会输出:
    // 错误处理:超时:数据请求未在规定时间内完成(2000ms后)
  });

代码解析:

  1. fetchData():模拟一个可能耗时的异步操作(如API请求),这里用setTimeout模拟3秒的网络延迟。

  2. createTimeoutController():创建一个超时控制器,接收超时时间(毫秒)和超时提示信息,在指定时间后会reject一个错误。

  3. fetchDataWithTimeout():核心函数,通过Promise.race()让实际异步操作和超时控制器“竞速”:

    • 如果异步操作在超时前完成,就返回操作结果
    • 如果超时时间先到,就触发超时错误
  4. 使用示例:设置超时时间为4秒(长于3秒的操作耗时),会正常返回结果;如果将超时时间设为2秒(短于操作耗时),则会触发超时错误。

这种模式广泛应用于需要控制异步操作最大耗时的场景,如网络请求、文件读取等,避免程序无限期等待。

目录
相关文章
|
1月前
|
前端开发 JavaScript API
js实现promise常用场景使用示例
本文介绍JavaScript中Promise的6种常用场景:异步请求、定时器封装、并行执行、竞速操作、任务队列及与async/await结合使用,通过实用示例展示如何优雅处理异步逻辑,避免回调地狱,提升代码可读性与维护性。
189 10
|
前端开发 Java
Promise--代码实现-- ajax 传统方式和 promise 方式和 promise 代码优化/重排 方式的对比--综合代码示例
Promise--代码实现-- ajax 传统方式和 promise 方式和 promise 代码优化/重排 方式的对比--综合代码示例
155 0
|
3月前
|
前端开发 JavaScript API
一文吃透 Promise 与 async/await,异步编程也能如此简单!建议收藏!
在前端开发中,异步编程至关重要。本文详解了同步与异步的区别,通过生活化例子帮助理解。深入讲解了 Promise 的概念、状态及链式调用,并引入 async/await 这一语法糖,使异步代码更清晰易读。还介绍了多个异步任务的组合处理方式,如 Promise.all 与 Promise.race。掌握这些内容,将大幅提升你的异步编程能力,写出更优雅、易维护的代码,助力开发与面试!
214 0
一文吃透 Promise 与 async/await,异步编程也能如此简单!建议收藏!
|
3月前
|
前端开发 JavaScript API
JavaScript异步编程:从Promise到async/await
JavaScript异步编程:从Promise到async/await
437 204
|
前端开发 JavaScript 开发者
Async 和 Await 是基于 Promise 实现
【10月更文挑战第30天】Async和Await是基于Promise实现的语法糖,它们通过简洁的语法形式,借助Promise的异步处理机制,为JavaScript开发者提供了一种更优雅、更易于理解和维护的异步编程方式。
250 1
|
9月前
|
前端开发
使用 async/await 结合 try/catch 处理 Promise.reject()抛出的错误时,有什么需要注意的地方?
使用 async/await 结合 try/catch 处理 Promise.reject()抛出的错误时,有什么需要注意的地方?
378 57
|
12月前
|
前端开发
如何使用async/await解决Promise的缺点?
总的来说,`async/await` 是对 Promise 的一种很好的补充和扩展,它为我们提供了更高效、更易读、更易维护的异步编程方式。通过合理地运用 `async/await`,我们可以更好地解决 Promise 的一些缺点,提升异步代码的质量和开发效率。
252 64
|
12月前
|
前端开发 JavaScript
async/await和Promise在性能上有什么区别?
性能优化是一个综合性的工作,除了考虑异步模式的选择外,还需要关注代码的优化、资源的合理利用等方面。
327 63
|
JSON 前端开发 JavaScript
浅谈JavaScript中的Promise、Async和Await
【10月更文挑战第30天】Promise、Async和Await是JavaScript中强大的异步编程工具,它们各自具有独特的优势和适用场景,开发者可以根据具体的项目需求和代码风格选择合适的方式来处理异步操作,从而编写出更加高效、可读和易于维护的JavaScript代码。
282 1