只运行 setInterval 5 分钟?

Posted

技术标签:

【中文标题】只运行 setInterval 5 分钟?【英文标题】:run setInterval for only 5 minutes? 【发布时间】:2015-05-07 17:33:28 【问题描述】:

所以我有以下代码。

 setInterval(function()
          steamOfferObj.getOffer(
              "tradeOfferId": tradeOfferID["tradeofferid"] // The tradeoffer id
          , function(error, body) 
              if (error == null) 
                console.log(body);
                  if (body.response.offer.trade_offer_state == 3) 
                      return "Offer Accepted"
                   else 
                      //on not accepted
                  
              
          );
      , 5000);

基本上它会提出一个蒸汽交易报价,看看它是否已经完成。然而,这实际上是无限期运行的,每 5 秒检查一次,直到程序运行时间。我是让它每 5 秒检查一次,持续 5 分钟,然后超时。

有什么办法可以做到这一点?

【问题讨论】:

你必须使用clearInterval 【参考方案1】:

您可以使用setTimeout。例如

 var yourIntervalId = setInterval(function()
          steamOfferObj.getOffer(
              "tradeOfferId": tradeOfferID["tradeofferid"] // The tradeoffer id
          , function(error, body) 
              if (error == null) 
                console.log(body);
                  if (body.response.offer.trade_offer_state == 3) 
                      return "Offer Accepted"
                   else 
                      //on not accepted
                  
              
          );
      , 5000);

在这里,您在 5 分钟(30000 毫秒)后清除间隔

setTimeout(function()
    clearInterval(yourIntervalId);
, 30000);

【讨论】:

【参考方案2】:

有间隔我会使用这样的东西:

var start = Date.now();
var theInterval = setInterval(function () 
    if (Date.now() - start > 300000) 
        clearInterval(theInterval);
        return;
    
    steamOfferObj.getOffer(
        "tradeOfferId": tradeOfferID.tradeofferid // The tradeoffer id
    , function (error, body) 
        if (error === null) 
            console.log(body);
            if (body.response.offer.trade_offer_state == 3) 
                return "Offer Accepted";
             else 
                //on not accepted
            
        
    );
, 5000);

但在这种情况下,我最好使用 setTimeout,因为您使用的是异步请求:

var start = Date.now();

function getData() 
    if (Date.now() - start > 300000) 
        return;
    
    steamOfferObj.getOffer(
        "tradeOfferId": tradeOfferID.tradeofferid // The tradeoffer id
    , function (error, body) 
        setTimeout(getData, 5000);
        if (error === null) 
            console.log(body);
            if (body.response.offer.trade_offer_state == 3) 
                return "Offer Accepted";
             else 
                //on not accepted
            
        
    );


getData();

【讨论】:

最终使用了您拥有的 setTimeout 示例。谢谢!【参考方案3】:

见 1-4

首先,在调用 setInterval 之前获取start 时间

第二个,保存timer_id

第三,获取current定时器调用的时间

第四,获取时差,超过5分钟,停止计时。

var start = (new Date()).getTime(); // 1
var timer_id = setInterval(function() // 2
      var current = (new Date()).getTime(); // 3
      if((current - start)/1000 > 5*60) clearInterval(timer_id); // 4
      steamOfferObj.getOffer(
          "tradeOfferId": tradeOfferID["tradeofferid"] // The tradeoffer id
      , function(error, body) 
          if (error == null) 
            console.log(body);
              if (body.response.offer.trade_offer_state == 3) 
                  return "Offer Accepted"
               else 
                  //on not accepted
              
          
      );
  , 5000);

【讨论】:

是的,那会更好 XD 哦,好吧.. 有人 (Xlander) 先有这个答案..【参考方案4】:

给变量赋值:var interval = setInterval;在 setInterval 之前定义当前时间:new Date()。在间隔内检查是否经过 5 分钟。如果是,请使用:clearInterval(interval)。

var now = new Date();
var intervalId = setInterval(function()
      var currNow = new Date();
      if ((currNow-now) / 60000 > 5) 
          clearInterval(intervalId );
          return; 
      
      steamOfferObj.getOffer(
          "tradeOfferId": tradeOfferID["tradeofferid"] // The tradeoffer id
      , function(error, body) 
          if (error == null) 
            console.log(body);
              if (body.response.offer.trade_offer_state == 3) 
                  return "Offer Accepted"
               else 
                  //on not accepted
              
          
      );
  , 5000);

【讨论】:

知道为什么需要在这里使用 Math.floor() 吗?

以上是关于只运行 setInterval 5 分钟?的主要内容,如果未能解决你的问题,请参考以下文章

js每隔五分钟执行一个函数

如何制作每15分钟运行一次的功能?

js--定时器的学习和对动画的封装(定时器)

使用 React 的 setInterval 动画只发生一次

BigQuery 脚本 - 慢

setinterval是异步还是同步