如何实现类似fs.writeFileSync的同步阻塞函数setTimeoutSync
实现 setTimeoutSync 阻塞主线程
实现代码
function setTimeoutSync(callback, delay) { const sharedBuffer = new SharedArrayBuffer(4); const int32Array = new Int32Array(sharedBuffer); setTimeout(() => { callback(); Atomics.notify(int32Array, 0); }, delay); Atomics.wait(int32Array, 0, 0); }
使用示例(index.js)
console.log('Start'); setTimeoutSync(() => { console.log('Job done'); }, 500); console.log('End');
原理说明
- 利用
SharedArrayBuffer创建共享内存,配合AtomicsAPI实现主线程的阻塞与唤醒:Atomics.wait会让当前主线程进入休眠状态,直到其他执行上下文(这里是setTimeout的回调)调用Atomics.notify- setTimeout回调执行完毕后,通过
Atomics.notify唤醒被阻塞的主线程,后续代码才会继续执行
- 该实现完全匹配需求:无需
async/await、不依赖第三方库、行为和fs.writeFileSync一致,调用时会阻塞主线程直到异步任务完成。
内容的提问来源于stack exchange,提问作者TechDogLover OR kiaNasirzadeh
相关产品推荐
相关产品推荐

