任务是这样,定时器在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!