首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >javascript || Angular2/6:多次调用setInterval,但最后一个timerId即使调用了clearInterval也没有停止

javascript || Angular2/6:多次调用setInterval,但最后一个timerId即使调用了clearInterval也没有停止
EN

Stack Overflow用户
提问于 2018-10-16 21:24:26
回答 1查看 1.2K关注 0票数 1

要求:

  1. 用户扫描多个作业号,对于每个作业号,我需要调用一个接口,获取总的作业详细信息,并将其显示在扫描的文本框下面的表中。
  2. 用户不想等待API调用完成。不管有没有细节,他都会连续扫描。

我做了什么:

  1. 我已经获取了一个变量jobNumberList,它存储了用户扫描的所有作业编号
  2. 我不断调用API,使用这些作业numbers.
  3. When API,给出响应,然后我添加到表
  4. 我创建了一个名为m1()
  5. m1() => < jobNumberList >H121这个方法会将jobNumberList与表行数据进行比较。
    • 如果在与jobNumberList数据比较时在表行数据中找不到任何项目,则这些项目仍在加载作业(表示API,未对这些作业做出响应)

  1. 我正在使用setInterval()调用m1() (时间间隔= 1000 )
  2. 当jobNumberList和表行数据匹配时,我将取消间隔

问题:尽管我正在停止轮询,但间隔仍在执行。问题会是什么?

*

问题是间歇性的(不是连续的)。当我快速扫描工作编号时,它就来了。正常速度不来。

*

我的代码如下

代码语言:javascript
复制
 // START INTERVAL  
 startPolling() {
    var self = this;
    this.isPollingNow = true;
    this.poller = setInterval(() => {
      let jobsWhichAreScannedButNotLoadedInsideTableStill = self.m1();
      if (self.isPollingNow && jobsWhichAreScannedButNotLoadedInsideTableStill.length === 0) {
        self.stopPolling();
        self.isPollingNow = false;
      }
    }, 1000);
  }

  //STOP INTERVAL
  stopPolling() {
    var self = this;
    setTimeout(function () {
      window.clearInterval(self.poller); // OR  //clearInterval(self.poller) //
    }, 0);
  }

需求

调试图像

EN

回答 1

Stack Overflow用户

发布于 2018-10-19 03:41:10

下面的代码将创建并自动取消间隔,当没有更多的作业需要扫描时,此原则将完成您需要的技巧,如果您有任何疑问,请询问。

使用Clear Jobs按钮将jobs删除到保留所有现有作业的阵列中

代码语言:javascript
复制
var globalsJobs = [1,2,3,4];

function scannableJobs () {
	return globalsJobs;
}

function generateAutoCancellableInterval(scannableJobs, intervalTime) {
	var timer;
	var id = Date.now();
  
  timer = setInterval(() => {
  	console.log("interval with id [" + id + "] is executing");
    var thereUnresponseJobs = scannableJobs();
    if (thereUnresponseJobs.length === 0) {
    	clearInterval(timer);
    }
  }, intervalTime)
}

const btn = document.getElementById('removejobs');
const infobox = document.getElementById('infobox');
infobox.innerHTML = globalsJobs.length + ' jobs remainings'

btn.addEventListener('click', function() {
	globalsJobs.pop();
  infobox.innerHTML = globalsJobs.length + ' jobs remainings'
}, false);

setTimeout(() => generateAutoCancellableInterval(scannableJobs, 1000), 0);
setTimeout(() => generateAutoCancellableInterval(scannableJobs, 1000), 10);
代码语言:javascript
复制
<button id="removejobs">
  clear jobs
</button>

<div id="infobox">
  
</div>
</div>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52836512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档