js 实现阻塞
同步阻塞(单线程阻塞)
在JavaScript中,由于单线程特性,可以通过同步操作(如循环或同步I/O)阻塞主线程。例如:
// 通过无限循环阻塞
while (true) {
console.log("Blocking main thread");
}
// 通过同步I/O阻塞(Node.js环境)
const fs = require('fs');
fs.readFileSync('largefile.txt'); // 同步读取大文件
alert/confirm/prompt 阻塞
浏览器提供的对话框API会阻塞UI线程:
alert("This blocks the UI until dismissed");
const result = confirm("Continue?");
const name = prompt("Enter your name");
Atomics.wait(SharedArrayBuffer)
使用Web Worker和SharedArrayBuffer的原子操作实现阻塞:
// 主线程
const sharedBuffer = new SharedArrayBuffer(4);
const sharedArray = new Int32Array(sharedBuffer);
// Worker线程中
Atomics.wait(sharedArray, 0, 0); // 阻塞直到被唤醒
Promise + 循环模拟
通过未解决的Promise和循环模拟阻塞效果:
function fakeBlock(ms) {
const start = Date.now();
while (Date.now() - start < ms) {}
}
fakeBlock(5000); // 阻塞5秒
Web Worker同步通信
在Worker中使用postMessage+onmessage实现伪同步:
// Worker.js
self.onmessage = (e) => {
if (e.data === 'block') {
const result = heavyTask();
self.postMessage(result);
}
};
// 主线程
worker.postMessage('block');
worker.onmessage = (e) => {
console.log(e.data);
};
Node.js同步模块
Node.js中部分模块提供同步API实现阻塞:
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update('data').digest('hex'); // CPU密集型计算
注意事项
- 浏览器环境避免长时间阻塞主线程,会导致页面无响应
- Node.js中同步操作可能影响事件循环性能
- Web Worker和
SharedArrayBuffer需考虑兼容性和安全策略







