delay_value
的用户执行一个函数。delay_value
可以在几秒到几周甚至几个月之间变化。 (也可以是零)如果我只想延迟几秒钟,我会简单地说:
setTimeout (execute_my_function (), delay_value x 1000);
如果delay_value
像几天或几个月,你会建议我如何处理?
修改即可。更多解释补充说。对不起,如果我的初步问题没有得到足够的解释。
立即运行
function A
,在
function B
之后{延迟5秒延迟<{1}}运行A
在
function C
之后运行B
,延迟12小时,从现在起一小时后运行
function D
,然后在12月10日运行
function E
答案 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,你应该使用较小的数字