每天做个总结吧,坚持就是胜利!
/**
@date 2021-06-17
@description 实现一个sleep函数
*/
壹(序)
sleep函数顾名思义就是需要实现一个能等待执行的函数;
首先想到的是肯定需要使用setTimeout,然后想到Generator函数是可以用yield暂停代码的,所以这应该也能实现;
那么作为Generator函数的语法糖,async/await应该也能实现;
async/await可以实现,那么Promise应该也没问题,所以有四种方式。
贰(实现)
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'
Generator函数:
function *sleep(fn, wait, ...args) {
const innerFunc = () => {
setTimeout(() => {
fn(...args);
}, wait)
}
yield innerFunc();
}
sleep(test, 1000, 'E1e').next(); // 1000ms后输出:'E1e'
async/await:
const sleep = async function(fn, wait, ...args) {
const innerFunc = () => {
setTimeout(() => {
fn(...args);
}, wait)
}
await innerFunc();
}
sleep(test, 1000, 'E1e'); // 1000ms后输出:'E1e'
Promise:
const sleep = (wait = 1000) => {
return new Promise((resolve) => {
setTimeout(resolve, wait)
})
}
sleep(3000).then(() => {
test('E1e'); // 3000ms后输出:'E1e'
});
叁(注意点)
第四种使用Promise实现时,需要在test()外面包装一层函数,否则会立即调用test函数。