而直到localStorage.getItem为';1';-Javascript
我有以下代码:而直到localStorage.getItem为';1';-Javascript,javascript,while-loop,local-storage,Javascript,While Loop,Local Storage,我有以下代码: localStorage.setItem('try', '1'); setTimeout(function(){localStorage.setItem('try', '2');}, 2000); while(localStorage.getItem('try') == '1') { console.log('a'); } 为什么它不起作用?这个while循环应该一直工作到localStorage.getItem('t
localStorage.setItem('try', '1');
setTimeout(function(){localStorage.setItem('try', '2');}, 2000);
while(localStorage.getItem('try') == '1')
{
console.log('a');
}
为什么它不起作用?这个while循环应该一直工作到localStorage.getItem('try')='1'。2秒后localStorage.setItem('try','2')因此这段时间应该停止,但不起作用:(为什么?我应该使用什么使其工作?,因为浏览器在单个线程中运行页面上的主JavaScript(以及大多数浏览器的UI),因此您的定时回调正在作业队列中等待当前正在运行的作业(其中包含
while
循环的作业)完成。由于while
循环作业从未完成,因此下一个作业从未运行
从不在基于浏览器的JavaScript中忙着等待(这在任何环境中都不是一个好主意)。相反,通过setTimeout
安排回调,以便在允许运行其他作业后检查结果,例如:
localStorage.setItem('try', '1');
setTimeout(function() {
localStorage.setItem('try', '2');
}, 2000);
function check() {
if (localStorage.getItem('try') != '1') {
console.log('a');
} else {
setTimeout(check, 0);
}
}
setTimeout(check, 0);
当然,这是一个非常激进的检查。您可能会使用更高的间隔,可能是100(10次/秒)或250(4次/秒)
旁注:我使用了
0
作为回调时间,它基本上会立即将计时器回调添加到作业队列中(但在其他作业之后)。浏览器会第一次尊重这一点,但当计时器回调调度计时器、调度计时器等时,浏览器最终会添加4ms的最小延迟(例如,表现得好像你通过了4而不是0)。关于这一点的详细信息在中(关于HTML).您正在阻塞执行引擎,因此,setTimeout
的回调永远没有机会运行,因为事件循环没有完成。嗯,我应该尝试使用递归函数,而不是使用setTimeout,这样做可能会行得通吗?@Warmix:我在上面添加了一个示例。