定时句柄会拿不到
为什么不出个getAllInterval,getAllTimeout之类的函数?
是因为安全问题, 性能问题还是别的原因不提供的?
定时句柄会拿不到
为什么不出个getAllInterval,getAllTimeout之类的函数?
是因为安全问题, 性能问题还是别的原因不提供的?
唉,这和什么JS不JS的无关吧?你用啥语言做个定时任务还有个句柄的?充其量你写这个定时啥的就是个函数。
举个很简单的例子,PHP中你要做延时就是加一个sleep(10)
(延迟10秒),golang中暂停执行也是:time.Sleep
,哪里还提供啥句柄给你,你自己处理的定时就自己想办法通过其他方式解决掉取消定时这个问题,根本就没有说给你个句柄做啥取消。
JS提供给你了,让你给方便取消啥的,你还想要个获取所有定时句柄的操作,另外你自行想一下,如果要提供给你所有句柄,让你去写这么一个getAllInterval
或者getAllTimeout
你怎么去实现?
所以如果你想,你自己写一个呗,再封装一层函数,类似于:
var allIntervalHandle = [];
function customSetInterval(callback,seconds) {
var handle = setInterval(callback,seconds);
allIntervalHandle.push(handle)
}
function getAllInterval() {
return allIntervalHandle;
}
定时器不是会返回句柄/唯一标识吗, 你想实现这个功能可以自己做
const hwnd = setTimeout(()=>{}, 10000)
const hwnd = setInterval(()=>{}, 1000)
9 回答9.4k 阅读
6 回答5.1k 阅读✓ 已解决
5 回答3.7k 阅读✓ 已解决
3 回答10.5k 阅读✓ 已解决
4 回答8k 阅读✓ 已解决
7 回答10.1k 阅读
4 回答7.4k 阅读
为什么?也许他们就是单纯地没想到
JS 中欠考虑的设计多了去了,所以很多问题你与其思考设计者为什么“考虑不”,不如在心中默认他们是“不考虑”。
题目里说的那种接口可能存在什么问题
在我看来,现有的
setTimeout
这种以简单类型作为任务标识的接口确实是有一定的隐患的,恶意开发者可以非常轻易地干预其他模块的延时任务,如果再定制一个更好使的接口出来,那无异于是给恶意代码递棍子(为什么不是递刀子呢?因为这个隐患其实不大,基本是安全的)。JS 虽然没有提供这样的接口,但是据我的经验,主流浏览器里面浏览器定时器/延时器返回的都是递增的整数,所以我们可以通过枚举的方法来干预页面里的所有定时/延时任务。
比如下面的代码就可以枚举取消浏览器中既有的全部延时任务,在一些使用延时器做动画或其他调度的页面上运行,可能会导致页面出 bug :
下面这段代码则可以把 Bilibili 首页的轮播图暂停下来:
不过制定规范的人显然对这种事情不以为意,不然后面出的
requestAnimationFrame
接口就应该返回Symbol
,以防此类枚举。