async function
定义了一个异步函数 lockedOperation()
。await lock;
表示等待当前 lock
Promise 对象完成,保证了操作的顺序性。- 每次操作完成后,将
lock
重新赋值为 resolved 状态的 Promise,以允许下一个操作执行。
虽然 JavaScript 并不支持传统意义上的线程和线程锁,但通过 Promise 链式调用或 async/await 语法,我们能够有效地管理异步操作的顺序性,避免竞态条件和并发问题。这种模式特别适合需要保证操作顺序的场景,如处理网络请求、文件操作等异步任务。
通过这篇文章,你现在应该能够理解如何在 JavaScript 中模拟线程锁的概念,并能够应用到实际开发中处理复杂的异步流程。
JavaScript 实现线程锁
ECMAScript 2018 中增加了 SharedArrayBuffer 和 Atomics ,利用它们可以实现锁(Lock),即页面主线程和 Web Worker 线程间的锁。
SharedArrayBuffer
SharedArrayBuffer(以下简称为SAB) 是一个可以主线程和 Web W...
问题描述:
最近,在uniapp上实现一个页面功能,需要在onReady之后获取canvasContext进行绘制,但是里面用到的一些参数,需要在onLoad上进行传参拿到,由于不同的手机,渲染速度不同,因此导致 onReady 与 onLoad 的执行先后顺序不确定,从而影响到后面的功能操作。
解决方案:
在后端,我们会想到直接使用锁来解决这个问题。但在JavaScript里面,是没有多线程的,因此也就不存在锁。在这里,我使用Promise实现锁。
Lock.js