# 1. 前言
sleep 函数既是面试中常问到的一道代码题,也是日常工作,特别是测试中常用的一个工具函数。
# 2. sleep 函数
sleep函数作用是让线程休眠,等到指定时间在重新唤起。
方法一: 这种实现方式是利用一个伪死循环阻塞主线程。因为 JS 是单线程的。所以通过这种方式可以实现真正意义上的 sleep()。
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() - start < delay) {
continue;
}
}
function test() {
console.log("111");
sleep(2000);
console.log("222");
}
test();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
方法二: 定时器
function sleep1(ms, callback) {
setTimeout(callback, ms);
}
//sleep 1s
sleep1(1000, () => {
console.log(1000);
});
1
2
3
4
5
6
7
2
3
4
5
6
7
方法三: es6 异步处理
const sleep = (time) => {
return new Promise((resolve) => setTimeout(resolve, time));
};
sleep(1000).then(() => {
console.log(1);
});
1
2
3
4
5
6
2
3
4
5
6
方法四: yield 后面是一个生成器 generator
function sleepGenerator(time) {
yield new Promise(function(resolve,reject){
setTimeout(resolve,time);
})
}
sleepGenerator(1000).next().value.then(()=>{console.log(1)})
1
2
3
4
5
6
2
3
4
5
6
方法五: es7---- async/await 是基于 Promise 的,是进一步的一种优化
function sleep(time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
async function output() {
let out = await sleep(1000);
console.log(1);
return out;
}
output();
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 3. delay 函数
function delay(func, seconds, ...args) {
return new Promise((resolve, reject) => {
setTimeout(() => {
Promise.resolve(func(...args)).then(resolve);
}, seconds);
});
}
console.log(new Date());
delay(
(str) => {
return new Error("抛出错误");
},
3000,
"延迟函数"
)
.then((o) => console.log(o))
.catch((e) => {
console.log("error", e);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20