当前位置:首页 > JavaScript

js 实现暂停

2026-04-06 10:16:10JavaScript

使用 setTimeoutclearTimeout 控制暂停

通过 setTimeout 设置延时执行任务,保存返回的 timeoutId,调用 clearTimeout(timeoutId) 可以取消延时任务,实现暂停效果。

let timeoutId;

function startTask() {
  timeoutId = setTimeout(() => {
    console.log("Task executed");
  }, 3000);
}

function pauseTask() {
  clearTimeout(timeoutId);
}

使用 Promiseasync/await 实现可控暂停

通过 Promiseasync/await 结合标志位控制执行流程,利用 setInterval 轮询检查是否继续执行。

js 实现暂停

let isPaused = false;

async function runTask() {
  while (true) {
    if (isPaused) {
      await new Promise(resolve => setTimeout(resolve, 100));
      continue;
    }
    console.log("Task running");
    await new Promise(resolve => setTimeout(resolve, 1000));
  }
}

function togglePause() {
  isPaused = !isPaused;
}

使用 Generator 函数分步执行

通过 Generator 函数分步执行任务,外部调用 next() 控制执行进度,实现暂停与继续。

function* taskGenerator() {
  yield console.log("Step 1");
  yield console.log("Step 2");
  yield console.log("Step 3");
}

const task = taskGenerator();
task.next(); // 执行第一步
// 暂停后再次调用 task.next() 继续执行

使用 AbortController 中断异步操作

现代浏览器支持 AbortController,可用于中断 fetch 等异步操作,实现类似暂停的效果。

js 实现暂停

const controller = new AbortController();

async function fetchData() {
  try {
    const response = await fetch("https://api.example.com", {
      signal: controller.signal
    });
    console.log(await response.json());
  } catch (e) {
    if (e.name === "AbortError") {
      console.log("Request aborted");
    }
  }
}

function abortRequest() {
  controller.abort();
}

使用 requestAnimationFrame 控制动画暂停

对于动画场景,可通过 requestAnimationFrame 和取消机制实现暂停。

let animationId;
let isAnimating = false;

function animate() {
  // 动画逻辑
  animationId = requestAnimationFrame(animate);
}

function toggleAnimation() {
  if (isAnimating) {
    cancelAnimationFrame(animationId);
  } else {
    animate();
  }
  isAnimating = !isAnimating;
}

使用 Worker 线程控制

通过 Web Worker 在后台线程执行任务,主线程通过 postMessage 发送暂停指令。

// main.js
const worker = new Worker("worker.js");
worker.postMessage({ command: "start" });

function pauseWorker() {
  worker.postMessage({ command: "pause" });
}

// worker.js
let isPaused = false;

self.onmessage = function(e) {
  if (e.data.command === "pause") {
    isPaused = true;
  }
};

每种方法适用于不同场景,根据具体需求选择合适方案。定时器方案适合简单延时任务,Promise 方案适合异步流程控制,Generator 适合分步操作,AbortController 专精网络请求中断,requestAnimationFrame 针对动画,Worker 适用于后台计算任务。

标签: js
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现报表

js实现报表

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

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js节流实现

js节流实现

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