实现一个sleep函数

933 阅读1分钟

每天做个总结吧,坚持就是胜利!

    /**
        @date 2021-06-17
        @description 实现一个sleep函数
    */

壹(序)

sleep函数顾名思义就是需要实现一个能等待执行的函数;

首先想到的是肯定需要使用setTimeout,然后想到Generator函数是可以用yield暂停代码的,所以这应该也能实现;

那么作为Generator函数的语法糖async/await应该也能实现;

async/await可以实现,那么Promise应该也没问题,所以有四种方式。

贰(实现)

  1. setTimeout版本:
const sleep = (fn, wait = 1000) => {
    return function() {
        setTimeout(() => {
            fn.apply(this, arguments);
        }, wait)
    } 
}

function test(name) {
    console.log(name);
}

sleep(test)('E1e'); // 1000ms后输出:'E1e'
  1. Generator函数:
function *sleep(fn, wait, ...args) {
    const innerFunc = () => {
        setTimeout(() => {
            fn(...args);
        }, wait)
    }
    
    yield innerFunc();
}

sleep(test, 1000, 'E1e').next(); // 1000ms后输出:'E1e'
  1. async/await
const sleep = async function(fn, wait, ...args) {
    const innerFunc = () => {
        setTimeout(() => {
            fn(...args);
        }, wait)
    }
    
    await innerFunc();
}

sleep(test, 1000, 'E1e'); // 1000ms后输出:'E1e'
  1. Promise
const sleep = (wait = 1000) => {
    return new Promise((resolve) => {
        setTimeout(resolve, wait)
    })
}

sleep(3000).then(() => {
    test('E1e'); // 3000ms后输出:'E1e'
});

叁(注意点)

第四种使用Promise实现时,需要在test()外面包装一层函数,否则会立即调用test函数。