直到localStorage.getItem为'1' - Javascript

War*_*mix 3 javascript while-loop local-storage

我有这个代码:

    localStorage.setItem('try', '1');
    setTimeout(function(){localStorage.setItem('try', '2');}, 2000);


    while(localStorage.getItem('try') == '1')
    {
        console.log('a');
    }
Run Code Online (Sandbox Code Playgroud)

为什么它不起作用?这个while循环应该工作,直到localStorage.getItem('try')=='1'.2秒后localStorage.setItem('尝试','2')所以这应该停止但不做:(为什么?我应该用它来使它工作?

T.J*_*der 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);
Run Code Online (Sandbox Code Playgroud)

当然,这是一个非常激进的检查.您可能使用更高的间隔,可能是100(10次/秒)或250(4次/秒).


旁注:我已经将其0用作回调时间,它基本上将计时器回调立即添加到作业队列中(但是在其他作业之后).浏览器将第一次尊重,但是当计时器回调计划定时器,计划定时器等等时,最终浏览器会增加4ms的最小延迟(例如,表现得像你传递4而不是0).有关详细信息,请参阅HTML规范计时器部分(大约不仅仅是HTML).