当前位置:首页 > 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实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

js 实现vue

js 实现vue

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

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…