当前位置:首页 > JavaScript

js实现async延迟

2026-04-07 11:07:12JavaScript

使用 setTimeout 封装 Promise

通过 setTimeout 结合 Promise 实现延迟功能。以下是一个简单的异步延迟函数:

function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

// 使用示例
async function example() {
  console.log('开始');
  await delay(2000); // 延迟2秒
  console.log('结束');
}
example();

利用 async/await 和循环实现分阶段延迟

需要多次延迟时,可以通过循环结合 await 实现分阶段延迟:

async function delayedLog(message, ms, times) {
  for (let i = 0; i < times; i++) {
    await delay(ms);
    console.log(`${message} ${i + 1}`);
  }
}

// 每隔1秒打印一次,共3次
delayedLog('执行:', 1000, 3);

使用 Promise.race 实现带超时的延迟

结合 Promise.race 实现带有超时机制的延迟:

function timeoutDelay(ms, timeoutMs) {
  const delayPromise = new Promise(resolve => setTimeout(resolve, ms));
  const timeoutPromise = new Promise((_, reject) => 
    setTimeout(() => reject(new Error('超时')), timeoutMs)
  );

  return Promise.race([delayPromise, timeoutPromise]);
}

// 使用示例
async function example() {
  try {
    await timeoutDelay(3000, 2000); // 延迟3秒,但2秒后超时
  } catch (err) {
    console.error(err.message); // 输出: 超时
  }
}
example();

利用 AbortController 实现可取消的延迟

现代浏览器支持通过 AbortController 取消异步操作:

function cancellableDelay(ms, signal) {
  return new Promise((resolve, reject) => {
    const timeoutId = setTimeout(resolve, ms);

    signal.addEventListener('abort', () => {
      clearTimeout(timeoutId);
      reject(new Error('延迟已取消'));
    });
  });
}

// 使用示例
const controller = new AbortController();

async function example() {
  try {
    console.log('开始');
    await cancellableDelay(3000, controller.signal);
    console.log('结束');
  } catch (err) {
    console.error(err.message);
  }
}

example();
// 取消延迟
setTimeout(() => controller.abort(), 1000); // 1秒后取消

使用生成器函数实现复杂延迟逻辑

通过生成器函数可以创建更复杂的延迟控制流:

js实现async延迟

function* delayedSequence() {
  yield delay(1000);
  console.log('第一步完成');
  yield delay(1500);
  console.log('第二步完成');
  yield delay(500);
  console.log('第三步完成');
}

// 执行生成器
async function runGenerator() {
  const gen = delayedSequence();
  for await (const _ of gen) {
    // 迭代执行每个yield
  }
}
runGenerator();

这些方法覆盖了从基础到高级的异步延迟场景,根据具体需求选择合适实现方式。

标签: jsasync
分享给朋友:

相关文章

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…