仅运行5分钟的setInterval?

6

我有以下代码。

 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);

基本上它会查询一个Steam交易报价,以查看它是否已经完成。然而,这实际上是无限运行的,每隔5秒钟检查一次,直到程序超时。我想要的是它每隔5秒钟检查一次,持续5分钟,之后超时。
有什么办法可以做到这样吗?

你必须使用 clearInterval - Rakesh_Kumar
4个回答

9

您可以使用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);

4

我想要使用类似以下代码的间隔:

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示例。谢谢! - Jake

1

请查看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)已经先回答了。 - Kokizzu

0
将时间间隔分配给一个变量:var interval = 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()吗? - zb'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接