【问题标题】:JavaScript timer threadJavaScript 定时器线程
【发布时间】:2012-11-15 19:13:52
【问题描述】:

我有一个函数 checkReg(),它会检查我的设备是否在它启动的第一个进程中已在服务器上注册并返回一个 regStatus 变量。该功能工作正常,但注册需要一些时间才能完成,并且我的应用程序在没有确认注册完成的情况下无法继续。

我想使用一个简单的线程检查 regStatus 一次 1 秒,如果未注册,则在 5 次尝试后终止线程并返回,如果在 5 次尝试之前完成,则终止线程并继续.

Thread(run every 1 sec){
    regStatus=checkReg();
    if(regStatus==='done'){

        //do something
        //kill thread
    }else if(regStatus==='inprogress'){

        //do nothing
    }elseif(regStatus==='error'){

        //kill thread
    }
}

我对 JS 很陌生,不知道如何启动、计时或终止线程。我已经使用了 setTimeout 函数,但我不确定它是否可以做我想做的事情。

【问题讨论】:

  • JavaScript 通常是单线程的。您的checkReg 正在制作XMLHttpRequest
  • 我相信是的,它是来自第 3 方 SDK 的功能,我使用它必须与他们的服务器通信
  • @Amanni:它不提供回调什么的吗? checkReg 究竟做了什么?
  • 返回 1、0 或错误
  • @Amanni:你有那个第 3 方 SDK 的 API 参考吗?它应该告诉你它是否接受回调函数。

标签: javascript timer thread-sleep


【解决方案1】:

JavaScript 通常没有线程,但您可以轻松地改用setInterval()

var retry = 0

function checkStatus() {
  var regStatus=checkReg();
  if(regStatus==='done'){
    //...
  }
  if(++retry > 5) {
    clearTimeout(id);
  }
}

var id = setInterval(checkStatus, 1000);

【讨论】:

  • 如果regStatus 发出同步请求,它仍然会阻塞。使用 setTimeout 不会阻止这种情况。它只是将执行延迟一秒钟。
  • @user1689607:你说得对,我认为checkReg() 影响setTimeout() 频率的速度并没有那么慢。如果是这样,OP 将在 UI 响应方面遇到更大的问题。他当然可以使用setTimeout() 并计算每次延迟(1 秒减去checkReg() 运行时间)。
  • 我确实阻塞了但不到 5 秒,除非出现错误,然后只有 5 秒。我会一直使用它,直到找到不会阻塞的解决方案。
  • @Amanni 您的 checkReg() 功能块 5 秒,您想每秒运行一次吗?浏览器是否也冻结了这 5 秒?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2020-02-25
  • 2011-03-04
  • 2021-12-03
  • 2011-10-18
  • 2011-05-21
相关资源
最近更新 更多