Javascript,执行具有广泛延迟值的函数?

时间:2017-11-09 14:03:01

标签: javascript

  • 我的JavaScript后台应用程序想要使用给定delay_value的用户执行一个函数。
  • delay_value可以在几秒到几周甚至几个月之间变化。 (也可以是零)

如果我只想延迟几秒钟,我会简单地说:

setTimeout (execute_my_function (), delay_value x 1000);

如果delay_value像几天或几个月,你会建议我如何处理?

修改即可。更多解释补充说。对不起,如果我的初步问题没有得到足够的解释。

  • 我的应用在移动设备中运行,
  • 它包括两部分:1。接收用户输入的UI应用程序,2。我在问题中提及的后台服务应用程序
  • 后台服务应用程序通过消息端口
  • 与UI应用程序通信
  • 用户可以请求使用相应的延迟值一次运行多个功能
  • 例如,
  

立即运行function A

     

function B之后{延迟5秒延迟<{1}}运行A

     

function C之后运行B,延迟12小时,

     

从现在起一小时后运行function D

     

然后在12月10日运行function E

  • 当许多功能的计时器正在滴答时,用户可以再次发送多个请求

4 个答案:

答案 0 :(得分:1)

使用*运算符转换day中的millisecond

setTimeout (execute_my_function (), delay_in_day * 24 * 60 * 60 * 1000);

使用*运算符转换month中的millisecond

setTimeout (execute_my_function (), delay_in_month * (365.25 / 12 ) * 24 * 60 * 60 * 1000);

setTimeout (execute_my_function (), delay_in_month * 30 * 24 * 60 * 60 * 1000);

答案 1 :(得分:1)

白天:

newSetTimeout (execute_my_function(), delay_day * 24 * 60 * 60 * 1000);

月份(平均365.25 / 12天/月)

newSetTimeout (execute_my_function(), delay_month * 365.25 * 2 * 60 * 60 * 1000);

<强> FIX

来自@UchihaItachi的回答,setTimeout中的最大时间是0x7FFFFFFF。 因此,最好将newSetTimeout创建为

function newSetTimeout(func, time){
    if(time <= 0x7FFFFFFF){
        setTimeout(func, time)
    } else {
        var ctime = Date.now()
        setTimeout(function(){
            newSetTimeout(func, time - (Date.now() - ctime))
        }, 0x7FFFFFFF);
    }
}

答案 2 :(得分:1)

使用setTimeout延迟大延迟的函数执行是个坏主意。此外,setTimeout的约束时间约为25天(setTimeout使用32位int来存储延迟,因此允许的最大值为2147483647)。

我建议根据现在的日期存储创建时间,延迟和检查。如果延迟超过限制,则稍后调用

var delayedFns=[];

var timeoutFn=function(creation_time,delay_value,fn){
 var delayNow = (new Date()-creation_time)+(delay_value*1000); 
 if(delayNow <  2147483647){
   setTimeout(fn, delay_value*1000);
 }else{ 
   delayedFns.push({
    fn:fn,
    delay_value:delay_value, 
    creation_time:creation_time
   })
 }
}

setInterval(function(){
 var fnObj= delayedFn.splice(0,1);
 timeoutFn(fnObj.creation_time,fnObj.delay_value,fnObj.fn)
},24*60*60*1000);

答案 3 :(得分:0)

setTimeout使用32位int来存储延迟,所以我不认为你真的可以直接使用它,如果你想等待一个值大于2147483647的时间。它会导致大多数浏览器出现溢出,我认为 。你必须在一段时间之后递归地调用它。我假设延迟值以秒为单位:

var initialTimeOutDate = new Date((new Date()).getTime() + delay_value*1000)
function doTimeoutForLargeData( initialTimeOutDate , execute_my_function ) {
    var  currentTime = (new Date()).getTime();      
    var difference  = initialTimeOutDate.getTime() - currentTime;
    if (difference  >= 0x7FFFFFFF){
        setTimeout(function() {doTimeoutForLargeData(initialTimeOutDate , execute_my_function )}, 0x7FFFFFFF);
    }else{
        setTimeout(execute_my_function, difference  );
    }
}

P.S 0x7FFFFFFF只是最大的32位int,你应该使用较小的数字