generator
-
定义:是es6新引入的新的数据类型,看起来像函数,但是可以返回多次,并且记录状态 可以看作看暂停得函数。
-
语法:gennerator对象用function* 来声明,用yield暂停多次返回,也可以用return。调用的时候用next.或用for of 循环迭代。
-
作用:可以用同步代码的书写方式书写异步代码。避免回调地狱。
next
generator()返回的是一个generator对象。用next 实现分阶段调用generator,每次返回值是一个对象{value:yield后边的值,done:布尔值},done 属性是一个布尔值,表示 Generator 函数是否执行完毕,即是否还有下一个阶段
当代码执行完,或者 遇到return时 done变为true;
function* fn(){
let id = 0;
yield ++id;
yield ++id
}
let aa = fn()
console.log(aa.next()) //{value:1,done:false}
console.log( aa.next())//{value:2,done:false}
console.log( aa.next())//{value: undefined, done: true}
- 补充 :function 如果用fn()的方式调用,代码执行完 没有return 得情况下,那么默认返回undefined
做一个自增ID
function* default_id(id) {
while (true) {//while 是为了保证能一直阶段性返回
yield ++id
}
}
let idConstructor = default_id(0)
console.log(idConstructor.next())//{value:1,done:false}
console.log(idConstructor.next())//{value:2,done:false}
console.log(idConstructor.next())//{value:3,done:false}
for of
for of 可以一次性执行generator 所有结果。
function* saveMoney(){
let sum = 0;
while(sum <999999999){
sum +=10000000
yield sum
}
return '赚够了'
}
let generator = saveMoney();
for(let res of generator){
console.log(res)
}
//执行结果 1,2,3,4,5
网友评论