JavaScript是单线程语法,没有语言内置的休眠(sleep or wait)函数,所谓的sleep只是实现一种延迟执行的效果,无论是使用ES5,Promise,generator或者async await实现sleep,核心只是应用到了setTimeout方法。
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()的方法,兼容性是最好的,但是使用了回调函数的实现方式,代码的可读性和维护性不是很好。
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的语法实现。
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 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 删除。