js实现一个可指定超时时间的异步函数重试机制

简介: js实现一个可指定超时时间的异步函数重试机制

可以使用async/await和Promise.race来实现一个可指定超时时间的异步函数重试机制,具体代码如下:

async function retryWithTimeout(fn, maxAttempts, delay, timeout) {
  let attempt = 0;
  while (attempt < maxAttempts) {
    try {
      const result = await Promise.race([fn(), timeoutPromise(timeout)]);
      return result;
    } catch (error) {
      console.error(`Attempt #${attempt + 1} failed with error: ${error.message}`);
      attempt++;
      if (attempt === maxAttempts) {
        throw error;
      }
      await delayPromise(delay);
    }
  }
}
function timeoutPromise(timeout) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      reject(new Error('Timeout'));
    }, timeout);
  });
}
function delayPromise(delay) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, delay);
  });
}

使用时,传入一个需要重试的异步函数fn、最大重试次数maxAttempts、每次重试的延迟时间delay和超时时间timeout。其中timeoutPromise和delayPromise分别返回一个设置了超时和延迟的Promise,retryWithTimeout函数在每次重试时等待delayPromise返回的Promise,如果fn在timeout时间内未返回结果,则返回timeoutPromise返回的Promise。重试次数达到maxAttempts时,抛出错误。


目录
相关文章
|
1天前
|
前端开发 JavaScript UED
由于JavaScript是单线程的,因此在处理大量异步操作时,需要确保不会阻塞UI线程
【5月更文挑战第13天】JavaScript中的Promise和async/await常用于处理游戏开发中的异步操作,如加载资源、网络请求和动画帧更新。Promise表示异步操作的结果,通过.then()和.catch()处理回调。async/await作为Promise的语法糖,使异步代码更简洁,类似同步代码。在游戏循环中,使用async/await可清晰管理资源加载和更新,但需注意避免阻塞UI线程,并妥善处理加载顺序、错误和资源管理,以保证游戏性能和稳定性。
12 3
|
1天前
|
JavaScript 前端开发
在JavaScript中,函数原型(Function Prototype)是一个特殊的对象
【5月更文挑战第11天】JavaScript中的函数原型是一个特殊对象,它为所有函数实例提供共享的方法和属性。每个函数在创建时都有一个`prototype`属性,指向原型对象。利用原型,我们可以向所有实例添加方法和属性,实现继承。例如,我们定义一个`Person`函数,向其原型添加`greet`方法,然后创建实例`john`和`jane`,它们都能调用这个方法。尽管可以直接在原型上添加方法,但推荐在构造函数内部定义以封装数据和逻辑。
18 2
|
1天前
|
前端开发 JavaScript 数据处理
在JavaScript中,异步函数是指什么
【5月更文挑战第9天】JavaScript中的异步函数用于处理非立即完成的操作,如定时器、网络请求等。它们可通过回调函数、Promise或async/await来实现。示例展示了如何使用async/await模拟网络请求:定义异步函数fetchData返回Promise,在另一异步函数processData中使用await等待结果并处理。当fetchData的Promise解析时,data变量接收结果并继续执行后续代码。注意,调用异步函数不会阻塞执行,而是会在适当时间点继续。
11 0
|
1天前
|
自然语言处理 JavaScript 前端开发
在JavaScript中,this关键字的行为可能会因函数的调用方式而异
【5月更文挑战第9天】JavaScript中的`this`关键字行为取决于函数调用方式。在非严格模式下,直接调用函数时`this`指全局对象,严格模式下为`undefined`。作为对象方法调用时,`this`指向该对象。用`new`调用构造函数时,`this`指向新实例。通过`call`、`apply`、`bind`可手动设置`this`值。在回调和事件处理中,`this`可能不直观,箭头函数和绑定方法可帮助管理`this`的行为。
11 1
|
1天前
|
JavaScript 前端开发 网络架构
JavaScript中的箭头函数是一种新的函数表达形式
【5月更文挑战第9天】JavaScript的箭头函数以简洁语法简化函数定义,其特性包括:1) 不绑定自身this,继承上下文的this,适合回调和事件处理;2) 没有arguments对象,需用剩余参数语法访问参数;3) 不能用作构造函数,无new调用;4) 没有prototype属性,不支持基于原型的继承。箭头函数在特定场景下优化了this处理,但使用时要注意与普通函数的差异。
11 2
|
1天前
|
JavaScript 前端开发
js的一些内置函数
js的一些内置函数
7 1
|
1天前
|
JavaScript 前端开发 索引
js的includes函数
js的includes函数
13 1
|
1天前
|
JavaScript 安全 前端开发
js的map函数
js的map函数
7 0
|
1天前
|
JavaScript 前端开发
js的filter函数
js的filter函数
11 1
|
1天前
|
JavaScript 前端开发
js的函数
js的函数
10 0