为什么此javascript异步循环退出

时间:2019-11-16 13:51:18

标签: javascript debugging asynchronous firefox async-await

我已经使用此模式使用js更新网页:

//global 
let noRefresh = true;
// ws is a webSocket object

async function UpdateLoop(ws){
  const delay = seconds => new Promise(resolve => setTimeout(resolve, seconds * 1000))
      while(noRefresh==true){
        await delay(10)
        await RequestChanges(ws)
      }

  await RefreshConnection(ws)
  UpdateLoop(ws);
}

这一直很好。但是,我认为其他一些代码会导致此循环退出(或无限期暂停)。当我运行“单击”功能时,会发生这种情况。

目前,我正在努力研究如何调试它。我尝试使用console.log来检查它是否没有被卡在等待的功能之一中,并使用firefox调试工具逐步检查代码以查看可能是什么原因造成的。

如何跟踪导致浏览器退出上述异步循环的原因?这里最好的调试方法是什么?

1 个答案:

答案 0 :(得分:0)

事实证明,我是在蛮力地清除“鼠标”功能(用于单击保持功能中设置的计时器)中的所有计时器,这也清除了循环中的超时。

我通过添加一个全局timerID变量来解决...

//global 
let noRefresh = true;
let timerID = ''
// ws is a webSocket object

async function UpdateLoop(ws){
  const delay = seconds => new Promise(resolve => timerID = setTimeout(resolve, seconds * 1000))
      while(noRefresh==true){
        await delay(10)
        await RequestChanges(ws)
      }

  await RefreshConnection(ws)
  UpdateLoop(ws);
}


$(document).mouseup(function (e) {
    let id = window.setTimeout(function() {}, 0);
    while (id--) {
       if (id!=timerID){window.clearTimeout(id);}
    }
}