面试题答案
一键面试在JavaScript中处理并发场景下对象函数属性调用避免竞态条件,可以使用async
/await
结合Promise
以及锁机制。以下是具体方法及示例:
- 使用
async
/await
和Promise
实现简单锁机制- 定义一个锁状态变量和获取锁、释放锁的函数。
- 在需要避免竞态条件的函数中,先获取锁,操作完成后释放锁。
let lock = false;
async function acquireLock() {
while (lock) {
await new Promise(resolve => setTimeout(resolve, 100));
}
lock = true;
}
function releaseLock() {
lock = false;
}
const myObject = {
data: 0,
async concurrentFunction() {
await acquireLock();
try {
// 模拟异步操作
await new Promise(resolve => setTimeout(resolve, 100));
this.data++;
console.log('Data incremented:', this.data);
} finally {
releaseLock();
}
}
};
// 模拟多个异步任务同时调用
const tasks = Array.from({ length: 5 }, () => myObject.concurrentFunction());
Promise.all(tasks).then(() => {
console.log('All tasks completed. Final data:', myObject.data);
});
在上述代码中:
acquireLock
函数通过循环等待直到锁lock
为false
,然后设置lock
为true
获取锁。releaseLock
函数将lock
设置为false
释放锁。myObject.concurrentFunction
函数在执行核心逻辑前先调用acquireLock
获取锁,完成后在finally
块中调用releaseLock
释放锁,确保数据一致性。- 最后通过
Promise.all
模拟多个异步任务同时调用concurrentFunction
。