直到localStorage.getItem为'1' - Javascript

时间:2017-03-26 16:03:35

标签: 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('try')=='1'。 2秒后localStorage.setItem('尝试','2')所以这一刻应该停止但不会这样做:(为什么?我应该使用什么来使它工作?

1 个答案:

答案 0 :(得分:7)

因为页面上的主要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)。其中的详细信息位于timers section of the HTML spec(大约超过HTML)。