方式一:使用Promise + then
 
 
const sleep = time => {
  return new Promise(resolve => {
    setTimeout(resolve,time)
  })
}
var start = new Date().getTime();
sleep(2000).then(() => {
  console.log(1);
  var end = new Date().getTime();       
  console.log(end-start+'ms');  
})
 
方式二:使用生成器函数 + then
 
 
function* sleep(time) {
  yield new Promise(resolve => {
    setTimeout(resolve, time)
  })
}
var start = new Date().getTime();
sleep(2000).next().value.then(() => {
  console.log(1);
  var end = new Date().getTime();
  console.log(end - start + 'ms');  
})
 
方式三:使用async + await
 
 
function sleep(time) {
  return new Promise(resolve => {
    setTimeout(resolve, time)
  })
}
var start = new Date().getTime();
async function output() {
  await sleep(2000);
  var end = new Date().getTime();
  console.log(end - start + 'ms');  
}
output()
 
方式四:直接通过setTimeout实现
 
function sleep(callback,time) {
  setTimeout(callback,time);
}
const start = new Date().getTime();
function output() {
  console.log(111);
  const end = new Date().getTime();
  console.log(`${end - start} ms`); 
}
sleep(output,2000)
 
RQ:为什么定时器执行后存在时间误差?