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后台应用”:浏览器扩展、网页上的工作线程、服务器进程、电子容器?