面试题答案
一键面试思路
在JavaScript中,虽然本身是单线程的,但可以通过setTimeout
模拟多任务执行场景。为了安全地操作数组(添加和删除元素),可以使用一个锁机制来确保同一时间只有一个任务可以操作数组,避免竞态条件。
代码实现
let array = [];
let lock = false;
function addElement(element) {
return new Promise((resolve) => {
while (lock);
lock = true;
setTimeout(() => {
array.push(element);
lock = false;
resolve();
}, 0);
});
}
function deleteElement(index) {
return new Promise((resolve) => {
while (lock);
lock = true;
setTimeout(() => {
if (index >= 0 && index < array.length) {
array.splice(index, 1);
}
lock = false;
resolve();
}, 0);
});
}
// 使用示例
addElement(1).then(() => {
return addElement(2);
}).then(() => {
return deleteElement(0);
}).then(() => {
console.log(array);
});
在上述代码中:
lock
变量作为锁,初始值为false
,表示当前没有任务在操作数组。addElement
函数和deleteElement
函数都通过while (lock)
等待锁释放,然后设置lock
为true
获取锁。- 使用
setTimeout
模拟异步任务,在任务完成后释放锁(设置lock
为false
)。 - 代码通过
Promise
链式调用展示了如何依次安全地执行添加和删除操作,并在最后打印数组结果。