var repeatFunc=repeat(console.log,4,3000) repeatFunc('hellow world');//每个3秒打印1次hellow wo

2022-10-25 14:14:03 浏览数 (1)

这是一个异步的处理加闭包的问题,setTimeout或者setInterval不可避免 方案1async/await Promise setTimeout while

代码语言:javascript复制
    function repeat(fn, num, delay) {
        return async function (str) {
            while (num) {
                await new Promise(res => {
                    setTimeout(function () {
                        fn(str);
                        num--;
                        res()
                    }, delay)
                })
            }
        }
    }
    var repeatFunc=repeat(console.log,4,3000);
    repeatFunc('hellow world')

方案2 setnterval clearInterval

代码语言:javascript复制
  function repeat(fn, num, delay) {
        return  function (str) {
            var timer=setInterval(function (params) {
                fn(str);
                num--;
                if(num===0){
                    clearInterval(timer)
                }
            },delay)
        }
    }
    var repeatFunc=repeat(console.log,4,3000);
    repeatFunc('hellow world')

方案3 setTimeout fn

代码语言:javascript复制
    function repeat(fn, num, delay) {
        return function (str) {
            function parint() {
                setTimeout(function () {
                    fn(str);
                    num--;
                    if (num > 0) {
                        parint();
                    }
                }, delay)
            }
            parint()
        }
    }
    var repeatFunc = repeat(console.log, 4, 3000);
    repeatFunc('hellow world')

方案4 setTimeout for未考虑执行时间,不严谨

代码语言:javascript复制
    function repeat(fn, num, delay) {
        return function (str) {
            var j = 1;
            for (let i=1;i<= num;i  ) {
                setTimeout(function (params) {
                    fn(str)
                }, delay * i)
            }
        }
    }
    var repeatFunc = repeat(console.log, 4, 3000);
    repeatFunc('hellow world')

0 人点赞