setTimeout-或者-setInterval关于-Javascript-计时器你需要知道的一切都在这里

先来回答一下下面这个问题:对于 setTimeout(function() { console.log('timeout') }, 1000) 这一行代码,你从哪里可以找到 setTimeout 的源代码(同样的问题还会是你从哪里可以看到 setInterval 的源代码)? 很多时候,可以我们脑子里面闪过的第一个答案肯定是 V8 引擎或者其它 VM们,但是要知道的一点是,所有我们所见过的 Javascript 计时函数,都没有出现在 ECMAScript 标准中,也没有被任何 Javascript 引擎实现,计时函数,其实都是由浏览器(或者其它运行时,比如 Node.js)实现的,并且,在不同的运行时下,其表现形式有可能都不一致。 在浏览器中,主计时器函数是 Window 接口的一部分,这保证了包括如 setTimeout、setInterval 等计时器函数以及其它函数和对象能被全局访问,这才是你可以随时随地使用 setTimeout 的原因。同样的,在 Node.js 中,setTimeout 是 global 对象的一部分,这拿得你也可以像在浏览器里面一样,随时随地的使用它。 到现在可能会有一些人感觉这个问题其实并没有实际的价值,但是作为一个 Javascript 开发者,如果不知道本质,那么就有可能不能完全的理解 V8 (或者其它VM)是到底是如何与浏览器或者 Node.js 相互作用的。 暂缓一个函数的执行计时器函数都是更高阶的函数,它们可以用于暂缓一个函数的执行,或者让一个函数重复执行(由他们的第一个参数执行需要执行的函数)。 下面这是一个暂缓执行的示例: setTimeout(() => { console.log('距离函数的调用,已经过去 4 秒了')}, 4 * 1000)在上面的示例中, setTimeout 将 console.log 的执行暂缓了 4 * 1000 毫秒,也就是 4 秒钟, setTimeout 的第一个函数,就是需要暂缓执行的函数,它是一个函数的引用,下面这个示例是我们更加常见到的写法: const fn = () => { console.log('距离函数的调用,已经过去 4 秒了')}setTimeout(fn, 4 * 1000)传递参数如果被 setTimeout 暂缓的函数需要接收参数,我们可以从第三个参数开始添加需要传递给被暂缓函数的参数: ...

August 21, 2019 · 4 min · jiezi

Go-定时器延时触发器

Go 可以借助 time.After/time.Ticker 来实现延迟/定时触发器,主要原理是借助无缓冲channel无数据时读取操作会阻塞当前协程,Go会在给定的时间后向channel中写入一些数据(当前时间),故阻塞的协程可以恢复运行,达到延迟或定时执行的功能。 延迟执行time.After(d Duration) 好像不如直接用 time.Sleep(d Duration)舒服,但存在即合理,time.After(d Duration)的强大之处在于是基于channel的,可以在不同的协程间同步传递。 package mainimport ( "time" "fmt")func main() { fmt.Println(time.Now().Format("2006-01-02 15:04:05")) // create a nobuf channel and a goroutine `timer` will write it after 2 seconds timeAfterTrigger = time.After(time.Second * 2) // will be suspend but we have `timer` so will be not deadlocked curTime, _ := <-timeAfterTrigger // print current time fmt.Println(curTime.Format("2006-01-02 15:04:05"))}定时执行time.Ticker 的使用分两种场景:执行几次后退出 和 循环执行不退出,执行几次就退出的话我们需要需要回收 time.Ticker。 ...

May 23, 2019 · 1 min · jiezi

Swoole-Timer-的应用

你好,SwoolePHP 的协程高性能网络通信引擎,使用 C/C++ 语言编写,提供了多种通信协议的网络服务器和客户端模块。 Swoole 可应用于互联网、移动通信、企业软件、网络游戏、物联网、车联网、智能家庭等领域。 学习 Swoole 之前,最好先了解下底层知识,比如,线程/进程、IO、TCP/IP协议 等。 推荐大家读一下《Linux 高性能服务器编程》这本书。我有这本书的PDF版,需要的可以关注公众号,回复 “Linux 高性能服务器编程” 即可获取。 这篇文章主要分享 Timer 毫秒精度的定时器。 本地版本:PHP 7.2.6、Swoole 4.3.1。 Timer主要有三个方法: swoole_timer_tick 间隔的时钟控制器 swoole_timer_after 指定的时间后执行 swoole_timer_clear 删除定时器 示例代码: //每隔3000ms触发一次$timer_id = swoole_timer_tick(3000, function () { echo "tick 3000ms - ".date('Y-m-d H:i:s')."\n";});//9000ms后删除定时器swoole_timer_after(9000, function () use ($timer_id) { echo "after 9000ms - ".date('Y-m-d H:i:s')."\n"; swoole_timer_clear($timer_id);});运行结果: tick 3000ms - 2019-04-07 21:36:56tick 3000ms - 2019-04-07 21:36:59tick 3000ms - 2019-04-07 21:37:02after 9000ms - 2019-04-07 21:37:02应用场景一、比如,每天凌晨跑业务脚本,脚本中包括了请求其他业务方或第三方的接口,如果接口超时无响应或没有数据返回,需要进行重试。 ...

May 15, 2019 · 2 min · jiezi