Javascript,执行具有大范围延迟值的函数? 我的JavaScript后台应用程序希望使用用户给定的delay\u值执行函数 延迟值可以从几秒钟到几周甚至几个月不等。(也可以是零)
如果我只想延迟几秒钟,我只想:Javascript,执行具有大范围延迟值的函数? 我的JavaScript后台应用程序希望使用用户给定的delay\u值执行函数 延迟值可以从几秒钟到几周甚至几个月不等。(也可以是零),javascript,Javascript,如果我只想延迟几秒钟,我只想: setTimeout (execute_my_function (), delay_value x 1000); 如果延迟值为天或月,您建议我如何处理 编辑。补充了更多的解释。对不起,如果我最初的问题解释得不够充分 我的应用程序在移动设备上运行 它包括两个部分:1。接收用户输入的UI应用程序,2。我在问题中提到的后台服务应用程序 后台服务应用程序通过消息端口与UI应用程序通信 用户可以使用相应的延迟值请求一次运行多个功能 比如说, 立即运行功能A 在A之后
setTimeout (execute_my_function (), delay_value x 1000);
如果延迟值
为天或月,您建议我如何处理
编辑。补充了更多的解释。对不起,如果我最初的问题解释得不够充分
- 我的应用程序在移动设备上运行
- 它包括两个部分:1。接收用户输入的UI应用程序,2。我在问题中提到的后台服务应用程序
- 后台服务应用程序通过消息端口与UI应用程序通信
- 用户可以使用相应的延迟值请求一次运行多个功能
- 比如说,
功能A
在A
之后以5秒延迟运行功能B
在B
之后延迟12小时运行功能C
从现在起一小时后运行功能D
然后在12月10日运行功能E
- 当许多功能的计时器在滴答作响时,用户可以再次发送多个请求
*
运算符在毫秒内转换天
:
setTimeout (execute_my_function (), delay_in_day * 24 * 60 * 60 * 1000);
setTimeout (execute_my_function (), delay_in_month * (365.25 / 12 ) * 24 * 60 * 60 * 1000);
使用*
运算符在毫秒内转换月份
:
setTimeout (execute_my_function (), delay_in_day * 24 * 60 * 60 * 1000);
setTimeout (execute_my_function (), delay_in_month * (365.25 / 12 ) * 24 * 60 * 60 * 1000);
或
使用*
运算符在毫秒内转换天
:
setTimeout (execute_my_function (), delay_in_day * 24 * 60 * 60 * 1000);
setTimeout (execute_my_function (), delay_in_month * (365.25 / 12 ) * 24 * 60 * 60 * 1000);
使用*
运算符在毫秒内转换月份
:
setTimeout (execute_my_function (), delay_in_day * 24 * 60 * 60 * 1000);
setTimeout (execute_my_function (), delay_in_month * (365.25 / 12 ) * 24 * 60 * 60 * 1000);
或
当天:
newSetTimeout (execute_my_function(), delay_day * 24 * 60 * 60 * 1000);
月份(平均365.25/12天/月)
修复
根据@UchihaItachi的回答,setTimeout中的最大时间为0x7fffff。
因此,最好将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);
}
}
函数newSetTimeout(func,time){
如果(时间为一天:
newSetTimeout (execute_my_function(), delay_day * 24 * 60 * 60 * 1000);
月份(平均365.25/12天/月)
修复
根据@UchihaItachi的回答,setTimeout中的最大时间为0x7fffff。
因此,最好将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);
}
}
函数newSetTimeout(func,time){
如果(timesetTimeout使用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位整数,您应该使用较小的数字setTimeout使用32位整数来存储延迟,因此我认为如果您想等待值大于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位整数,您应该使用较小的数字对于较大的延迟,使用setTimeout延迟函数执行是个坏主意。此外,setTimeout的限制大约为25天(setTimeout使用32位整数存储延迟,因此允许的最大值为2147483647)
我建议存储创建时间、延迟并根据现在的日期进行检查。如果延迟超过限制,请稍后致电
var delayedFns=[];
var timeoutFn=函数(创建时间、延迟值、fn){
var delayNow=(新日期()-创建时间)+(延迟值*1000);
如果(现在延迟<2147483647){
设置超时(fn,延迟值*1000);
}否则{
延迟推送({
fn:fn,
延迟值:延迟值,
创建时间:创建时间
})
}
}
setInterval(函数(){
var fnObj=延迟Fn.拼接(0,1);
timeoutFn(fnObj.creation\u time,fnObj.delay\u value,fnObj.fn)
},24*60*60*1000);
使用setTimeout延迟函数执行以获得较大延迟是个坏主意。此外,setTimeout的限制约为25天(setTimeout使用32位整数存储延迟,因此允许的最大值为2147483647)
我建议存储创建时间、延迟并根据现在的日期进行检查。如果延迟超过限制,请稍后致电
var delayedFns=[];
var timeoutFn=函数(创建时间、延迟值、fn){
var delayNow=(新日期()-创建时间)+(延迟值*1000);
如果(现在延迟<2147483647){
设置超时(fn,延迟值*1000);
}否则{
延迟推送({
fn:fn,
延迟值:延迟值,
创建时间:创建时间
})
}
}
setInterval(函数(){
var fnObj=延迟Fn.拼接(0,1);
timeoutFn(fnObj.creation\u time,fnObj.delay\u value,fnObj.fn)
}你所说的句柄是什么意思?你想用句柄做什么?什么是“JavaScript后台应用”:浏览器扩展、网页上的工作线程、服务器进程、电子容器?你所说的句柄是什么意思?你想用句柄做什么“JavaScript后台应用”:浏览器扩展、网页上的工作线程、服务器进程、电子容器?