Javascript 检查setTimeout的剩余时间

Javascript 检查setTimeout的剩余时间,javascript,Javascript,此代码在setTimeout中查找剩余时间,但当我想将其打印到控制台时,不会将其打印出来。 它很好地计算了剩余时间,但正如我所说的,当我想要打印剩余时间时,它会将未定义的时间处理到控制台 我不知道怎么做,伙计们。你能帮我吗 (函数(){ var nativeSetTimeout=window.setTimeout; window.bindTimeout=函数(侦听器,间隔){ 函数设置超时(代码、延迟){ var=0, H h=窗口.setInterval(函数(){ 经过时间+=间隔; 如果

此代码在
setTimeout
中查找剩余时间,但当我想将其打印到控制台时,不会将其打印出来。
它很好地计算了剩余时间,但正如我所说的,当我想要打印剩余时间时,它会将未定义的时间处理到控制台

我不知道怎么做,伙计们。你能帮我吗

(函数(){
var nativeSetTimeout=window.setTimeout;
window.bindTimeout=函数(侦听器,间隔){
函数设置超时(代码、延迟){
var=0,
H
h=窗口.setInterval(函数(){
经过时间+=间隔;
如果(经过<延迟){
侦听器(延迟-已用);
}否则{
窗口。清除间隔(h);
}
},间隔);
返回nativeSetTimeout(代码,延迟);
}
window.setTimeout=setTimeout;
设置超时。_native=nativeSetTimeout;
};
}());
const time=window.bindTimeout(函数(t){(t+“ms剩余”);});
console.log(时间)

setTimeout(函数(){console.log(“全部完成”);},1000)我发现您的代码存在一些问题:

  • 您的侦听器函数(
    function(t){(t+“ms remaining”)}
    )没有做任何事情:它正在计算
    t+“ms remaining”
    的值,但它没有返回它,也没有记录它或做任何事情。如果您想让它工作,您需要添加一个使用该值的
    console.log
  • 您的
    bindTimeout
    函数有一个
    interval
    参数,但它从未在代码中使用过:如果您不提供间隔,您的
    setInterval
    将永远不会启动,并且您将看不到任何消息
下面是解决此问题的方法:您需要在函数的作用域中创建一个变量,以便可以编辑其值。
window.bindTimeout
的返回值将是一个函数,用于返回从处理程序获得的当前值。
返回函数是获取变化值的唯一方法:唯一的替代方法是使用类,但它需要不同的结构


编辑:最终(我希望)版本

要获得准确的经过时间(没有由时间间隔确定的量化值),您需要保存设置计时器的日期,以便稍后将其与当前日期进行比较

我认为这是你能得到的最多的:它一次只支持一个“自定义”计时器;要同时支持多个,您必须创建更复杂的计时器和侦听器处理程序,这似乎不是问题所在。
它的工作方式是,当您想要创建其中一个“自定义”计时器时,您可以添加一些truthy作为
window.setTimeout的第三个参数:我认为这是一个很好的做法,否则您可能会损害自己的功能,因为如果库调用该方法,它将重置您的计时器

(函数(){
//将本机方法存储在此处
var nativeSetTimeout=window.setTimeout;
window.bindTimeout=函数(侦听器){
//在此范围内声明几个变量
变量timerStart,timerDelay
//此函数将返回保存在该变量中的值
函数getTimeLeft(){
//如果没有运行自定义计时器,则将未定义的传递给侦听器
如果(!timerStart)返回侦听器()
//计算计时器预期结束时间与当前时间之间的差值
让ms_diff=新日期(timerStart.getTime()+timerDelay)-新日期()
返回侦听器(ms_diff)
}
函数setTimeout(回调=()=>{},延迟){
//初始化变量
timerStart=新日期()
timerDelay=延迟
返回nativeSetTimeout(()=>{
timerStart=未定义
timerDelay=未定义
回调函数()
},延误)
}
//编辑本机方法以仅在添加最后一个参数时切换到自定义计时器
window.setTimeout=(回调,延迟,自定义)=>(自定义?setTimeout:nativeSetTimeout)(回调,延迟);
返回getTimeLeft
};
}());
让getTime=window.bindTimeout(t=>((t|||‘No’)+‘ms剩余’);
//时间变量将存储一个函数,该函数将在调用时为您提供值
//如果在设置超时之前调用它,它将返回undefined
console.log(getTime())
setTimeout(函数(){
console.log(“全部完成”);
},1000,true)//选中最后一个选项,此超时将为自定义超时
//如果在设置超时后调用它,它将显示总延迟
console.log(getTime())
//如果等待超时开始,它将返回正确的值
setTimeout(()=>console.log(getTime()),123)
setTimeout(()=>console.log(getTime()),456)
setTimeout(()=>console.log(getTime()),789)
//如果在超时完成后调用,它将返回未定义

window.setTimeout(()=>console.log(getTime()),1500)
我发现您的代码有一些问题:

  • 您的侦听器函数(
    function(t){(t+“ms remaining”)}
    )没有做任何事情:它正在计算
    t+“ms remaining”
    的值,但它没有返回它,也没有记录它或做任何事情。如果您想让它工作,您需要添加一个使用该值的
    console.log
  • 您的
    bindTimeout
    函数有一个
    interval
    参数,但它从未在代码中使用过:如果您不提供间隔,您的
    setInterval
    将永远不会启动,并且您将看不到任何消息
下面是解决此问题的方法:您需要在函数的作用域中创建一个变量,以便可以编辑其值。
window.bindTimeout
的返回值将是一个函数,用于返回从处理程序获得的当前值。
返回函数是获取变化值的唯一方法:唯一的替代方法是使用类,但是