前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript实现sleep方法

JavaScript实现sleep方法

原创
作者头像
伯爵
修改2019-10-17 17:06:22
11.2K0
修改2019-10-17 17:06:22
举报
文章被收录于专栏:前端小菜鸟

JavaScript是单线程语法,没有语言内置的休眠(sleep or wait)函数,所谓的sleep只是实现一种延迟执行的效果,无论是使用ES5,Promise,generator或者async await实现sleep,核心只是应用到了setTimeout方法。

  • setTimeout
代码语言:txt
复制
let sleepFun = function(fun, time) {
  setTimeout(function() {
    fun();
  }, time);
}

let fun = () => console.timeEnd('time');
console.time("time")
sleepFun (fun, 1000); //time: 1000.423095703125ms

直接使用setTimeout实现sleep()的方法,兼容性是最好的,但是使用了回调函数的实现方式,代码的可读性和维护性不是很好。

  • Promise
代码语言:txt
复制
let sleepFun = (time) => new Promise((resolve) => setTimeout(resolve, time));

let fun = () => console.timeEnd('time');
console.time("time");
sleepFun(3000).then(fun);

在ES6的语法中,我们借助Promise方法可以优雅的构建我们的sleep实现方法,避免了使用函数回调的使用方式。

Promise是sleep方法异步的实现一种方式,当我们需要同步执行的方式处理,可以使用generator和async await的语法实现。

  • generator
代码语言:txt
复制
let fun = () => console.timeEnd('time');
function* sleepFun(time) {
  yield new Promise((resolve) => {
    setTimeout(resolve, time);
  });
}

console.time('time');
sleepFun(1000).next().value.then(fun); // time: 1011.2138671875ms

generator是将Promise异步编程方式流程化的一种语法糖,这样我们就可以使用同步的方式编写异步请求。但是generator语法的可读性被没有因此提高,无法在语法层面提供语义化的支持,我们可以使用async await重构sleep方法的实现。

  • async await
代码语言:txt
复制
async function wait(time) {
  console.time('time');
  await sleepFun(time);
  fun();
}

wait(3000); // time: 3001.204833984375ms

async await实际上是generator和promise的语法糖,在提供同步编程方式实现异步调用的基础上,同时满足我们对sleep函数语义化的支持,也是常用的sleep的实现方式。

有了js版本的sleep(),我们就不需要调用服务端底层的线程休眠(如java的sleep())方法,也可以支持方法的暂停执行。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档