当前位置:首页 > JavaScript

js 实现阻塞

2026-04-04 04:39:46JavaScript

阻塞实现方法

在JavaScript中实现阻塞效果可以通过多种方式实现,以下是几种常见的方法:

使用同步XMLHttpRequest

通过同步的XMLHttpRequest请求可以实现阻塞效果,但这种方式在现代前端开发中不推荐使用,因为它会导致页面冻结。

var request = new XMLHttpRequest();
request.open('GET', 'https://example.com', false); // 同步请求
request.send(null);
if (request.status === 200) {
    console.log(request.responseText);
}

使用循环阻塞

通过while循环配合时间判断可以实现阻塞效果,但这种方式会大量消耗CPU资源。

js 实现阻塞

function sleep(milliseconds) {
    var start = new Date().getTime();
    while ((new Date().getTime() - start) < milliseconds) {
        // 空循环实现阻塞
    }
}
console.log('开始');
sleep(5000); // 阻塞5秒
console.log('结束');

使用Web Worker

Web Worker可以在后台线程中执行耗时操作而不阻塞主线程,但主线程和Worker线程间的通信是异步的。

// 主线程代码
var worker = new Worker('worker.js');
worker.postMessage('开始计算');
worker.onmessage = function(e) {
    console.log('收到结果:', e.data);
};

// worker.js
self.onmessage = function(e) {
    var result = heavyCalculation(); // 耗时计算
    self.postMessage(result);
};

使用Promise和async/await

通过Promise配合async/await语法可以实现非阻塞的异步代码,但看起来像是同步的。

js 实现阻塞

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

async function blockingExample() {
    console.log('开始');
    await delay(3000); // 等待3秒但不阻塞主线程
    console.log('3秒后');
}
blockingExample();

使用Atomics.wait

在共享内存环境中可以使用Atomics.wait实现真正的阻塞。

const sharedBuffer = new SharedArrayBuffer(4);
const sharedArray = new Int32Array(sharedBuffer);

// 线程1
Atomics.store(sharedArray, 0, 123);
Atomics.notify(sharedArray, 0, 1);

// 线程2
Atomics.wait(sharedArray, 0, 0); // 阻塞直到值改变
console.log(sharedArray[0]); // 123

注意事项

  • JavaScript是单线程语言,在主线程中实现阻塞会导致页面无响应
  • 现代前端开发推荐使用异步编程模式替代阻塞
  • Node.js环境有更多阻塞API可用,如fs.readFileSync
  • 浏览器环境下长时间阻塞可能导致页面被标记为无响应

替代方案

对于需要等待的场景,建议使用以下非阻塞替代方案:

  • setTimeout/setInterval
  • Promise/async-await
  • requestAnimationFrame
  • 事件监听机制
  • Web Workers多线程处理

标签: js
分享给朋友:

相关文章

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <htm…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…

js验证码实现

js验证码实现

验证码的基本原理 验证码(CAPTCHA)用于区分人类用户和自动化程序。常见类型包括图形验证码、滑动验证码、短信验证码等。JavaScript 可用于前端验证码的生成和验证逻辑。 图形验证码实现 使…