当前位置:首页 > JavaScript

js实现阻塞

2026-03-01 01:05:33JavaScript

同步阻塞

使用同步代码会阻塞JavaScript的执行,直到当前任务完成。由于JavaScript是单线程的,同步操作会阻止其他代码执行。

function syncBlock() {
    const start = Date.now();
    while (Date.now() - start < 3000) {} // 阻塞3秒
    console.log("同步阻塞完成");
}
syncBlock();
console.log("后续代码被阻塞");

循环阻塞

通过循环占用主线程实现阻塞。这种方式会持续占用CPU资源,导致页面无响应。

js实现阻塞

function loopBlock(duration) {
    const end = Date.now() + duration;
    while (Date.now() < end) {}
    console.log(`阻塞${duration}毫秒完成`);
}
loopBlock(2000);

定时器阻塞

虽然setTimeout本身是异步的,但可以通过递归调用实现类似阻塞的效果。这种方式比纯循环更友好。

js实现阻塞

function timerBlock(ms) {
    const start = Date.now();
    function check() {
        if (Date.now() - start < ms) {
            setTimeout(check, 0);
        } else {
            console.log("定时器阻塞完成");
        }
    }
    check();
}
timerBlock(3000);

Web Worker阻塞

在主线程中创建Worker并等待其完成。这种方式不会阻塞UI线程,但会阻塞主线程的执行流。

function workerBlock() {
    const worker = new Worker(URL.createObjectURL(
        new Blob([`postMessage('done');`], {type: 'application/javascript'})
    ));
    worker.onmessage = () => console.log("Worker完成");
    while(true) {} // 故意阻塞主线程
}

Atomics等待

使用SharedArrayBuffer和Atomics API可以实现真正的线程同步阻塞。

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

function atomicsBlock() {
    Atomics.wait(sharedArray, 0, 0); // 无限等待
    console.log("Atomics等待结束");
}

注意事项

JavaScript是单线程语言,阻塞主线程会导致页面失去响应。大多数情况下应该避免阻塞操作,改用异步编程模式。Web Worker是处理耗时任务的最佳选择,它不会影响主线程的执行。

标签: js
分享给朋友:

相关文章

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js实现跳转

js实现跳转

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

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现预览

js实现预览

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

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…