利用ES6的generator写一个时间间隔递增的定时器

任务是这样,定时器在0时刻打出1,然后隔1s打出2,隔2s打出3…….如此,时间间隔依次递增。

考虑用generator的 yield 功能来完成 停顿。

talk is cheap, here’s the code.

function sleep(sleepTime){

    setTimeout( ()=>{

        it.next()   // 关键在于异步控制 iterator 的 下一步。每次都会在 yield 中 停顿。

    }, sleepTime )
}


function *main(){

    for(let i = 1; i < 10; i++){

        console.log(i)

        yield sleep(i*1000)
    }

}


var it = main()

it.next()   // 推倒多米诺骨牌的第一张

把函数封装一下,加个计时器看看

function sleepTask(turn){

    function sleep(sleepTime){

        setTimeout( ()=>{

            it.next()

        }, sleepTime )
    }


    function *main(){

        let lastTime = new Date().getTime()

        for(let i = 1; i < turn; i++){

            let currTime = new Date().getTime()

            console.log(i, currTime - lastTime)

            lastTime = currTime

            yield sleep( i*1000 )
        }

    }


    var it = main()

    it.next()

}

sleepTask(5) // 开始!

控制台输出,有几毫秒的误差是由于JS引擎的单线程引起的。
这里写图片描述

Done~~~~~yeah!

猜你喜欢

转载自blog.csdn.net/github_36487770/article/details/79699841