Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
而直到localStorage.getItem为';1';-Javascript_Javascript_While Loop_Local Storage - Fatal编程技术网

而直到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:我在上面添加了一个示例。