# 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

方法二: 定时器

function sleep1(ms, callback) {
  setTimeout(callback, ms);
}
//sleep 1s
sleep1(1000, () => {
  console.log(1000);
});
1
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

方法四: 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

方法五: 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

# 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