博客
关于我
JavaScript 中实现 sleep
阅读量:410 次
发布时间:2019-03-06

本文共 1436 字,大约阅读时间需要 4 分钟。

来自推特上 Windows 故障分析的笑话 图片来源:

推上看到的笑话,Windows 故障分析的实现。

然后想起来 JavaScript 中如何实现这个 sleep() 函数让代码暂停指定时间。

异步版本

借助 这事很好实现。

function sleep(time) {  return new Promise(resolve => {    setTimeout(() => {      resolve();    }, time);  });}

创建一个 Promise,等待指定时间后 resolve 掉即可。

但,Promise 是异步的,它要求后续代码要么包含在 then 里面,要么通过 async/await 来调用。

所以使用起来应该像这样子,

function testSleep() {  console.log("will sleep for 1s");  sleep(1000).then(() => {    console.log("will sleep for another 5s");    sleep(5000).then(() => {      console.log("waked up");    });  });}testSleep();

或者这样子:

async function testSleep() {  console.log("will sleep for 1s");  await sleep(1000);  console.log("will sleep for another 5s");  await sleep(5000);  console.log("waked up");}testSleep();

测试 sleep

当然后者会更加优雅些,但本质上都是需要保证后续代码在 Promise 回调中执行。如何有回调之外的代码,则不会被阻断,这便是其缺点。

async function testSleep() {  console.log("will sleep for 1s");  await sleep(1000);  console.log("will sleep for another 5s");  await sleep(5000);  console.log("waked up");}testSleep();

// 🚨不会按预期那样最后执行,而是立即被执行
console.log("我在等上面的代码执行完...");

代码未阻断的情况

同步版本

不借助异步异步代码想阻断代码执行,那其实可以让代码原地跑,通过 while

function syncSleep(time) {  const start = new Date().getTime();  while (new Date().getTime() - start < time) {}}

使用起来就和正常函数没区别了,对周围代码也没有要求必需得在回调什么的:

console.log("start test sync sleep...");syncSleep(3000);console.log("sync sleep after 3s");

测试同步版本的 sleep

方便是方便,但不建议使用这种方式,毕竟代码在空跑。如果需要这样的场景,你需要考虑是否可以修改下代码或换个设计,异步能满足大部分需求。

相关资源

转载地址:http://ygdkz.baihongyu.com/

你可能感兴趣的文章
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
mysql 状态检查,备份,修复
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>
MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
查看>>
mysql 用户管理和权限设置
查看>>
MySQL 的 varchar 水真的太深了!
查看>>
mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
查看>>
MySQL 的instr函数
查看>>
MySQL 的mysql_secure_installation安全脚本执行过程介绍
查看>>
MySQL 的Rename Table语句
查看>>
MySQL 的全局锁、表锁和行锁
查看>>