es6之generator函数

什么是Generrator

Generator是es6提供的异步编程的一种解决方案。
可以理解为一种状态机,内部封装了多种状态。

使用

在function  关键字后面写一个* ,表示一个generator函数。
generator通过  yield 关键字来定义任务
  • 代码
function* p1 () {
  yield '任务1';
  yield '任务2';
  yield '任务3';
  return '任务结束'
}

//调用generator函数
var p = p1()

但是此时函数并没有执行
在阮一峰先生的《ECMAScript 6 入门》一书中是这样解释的:

	然后,Generator 函数的调用方法与普通函数一样,也是在函数名后面加上一对圆括号。不同的是,调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象,也就是上一章介绍的遍历器对象(Iterator Object)

也就是说,如果想让这个函数执行,必须调用遍历器对象的next方法。

p.next()
// next方法返回一个对象,它的value属性就是当前yield表达式的值,done属性的值false,表示遍历还没有结束。
//{ value: '任务1', done: false }
p.next()
//{ value: '任务2', done: false }
p.next()
//{ value: '任务3', done: false }
p.next()
//{ value: '任务结束', done: true }

yield和return相似之处在于,都会返回后面的表达式,但是return只能有一个,yield可以有多个。

  • 即使generator函数没有yield,也需要调用next方法,才能执行里面的语句
function* fn(){
    console.log("no-yiled")
}
var f=fn()
f.next()
  • yield只能存在于generator函数,否则会报错
var arr=[1,2,3,4,5,6]
function* fn(){
    arr.forEach((val)=>{
    yield val
    })
}
var a = fn();

arr.forEach(()=>{
	 a.next();
})

上面代码,想实现将arr数组中的值一项项输出,但是由于yield存在于forEach的回调函数中,不是generator函数,会报错
如果要实现下面代码,应该使用for循环

function* fn(){
     for(var i=0;i<arr.length;i++){
         yield console.log(arr[i])
     }
}
var a = fn();

arr.forEach(()=>{
    a.next();
})

你可能感兴趣的:(es6,javascript)