【问题标题】:While until localStorage.getItem is '1' - Javascript直到 localStorage.getItem 为 '1' - Javascript
【发布时间】:2017-08-19 06:09:42
【问题描述】:

我有这个代码:

    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') 所以这段时间应该停止但不这样做:(为什么?我应该用什么让它工作?

【问题讨论】:

  • 你阻塞了执行引擎,因此你的 setTimeout 的回调永远没有机会运行,因为事件循环没有轮到它

标签: javascript while-loop local-storage


【解决方案1】:

因为您页面上的主要 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 作为回调时间,它基本上将定时器回调立即添加到作业队列(但在其他作业之后)。浏览器第一次会尊重这一点,但是当一个定时器回调调度一个定时器时,它会调度一个定时器,等等,最终浏览器会添加一个 4 毫秒的最小延迟(例如,就像你传递了 4 而不是 0)。详细信息在timers section of the HTML spec(不仅仅是 HTML)中。

【讨论】:

  • hmm 我应该尝试使用递归函数而不是使用 setTimeout 的 while 并且这应该可以工作吗?
  • @Warmix:我在上面添加了一个示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 2022-08-07
  • 2013-02-07
相关资源
最近更新 更多