只运行 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 分钟?的主要内容,如果未能解决你的问题,请参考以下文章