Generator 函数 以及 function * 中 yield , next 的用法

504 阅读3分钟

[本文参考地址来至阮一峰的网络日志]www.ruanyifeng.com/blog/2015/0…)

Generator 函数最大特点就是可以交出函数的执行权(即暂停执行)。

  • 此函数名之前要加星号,以示区别。 Generator 函数就是一个异步任务的容器。异步操作需要暂停的地方,都用 yield 语句注明
function* demo(x){
  var y = yield x + 2;
  return y;
}
  • 声明一个变量 = 调用完Generator 函数之后,会返回一个内部指针(demo即遍历器),demo.next() 会指向第一个遇到的 yield 语句。Generator 函数执行它不会返回结果,返回的是指针对象。第一次调用指针demo 的next方法,会移动内部指针即执行异步任务的第一段,指向第一个遇到的 yield 语句,执行到 x + 2 为止。
  • next 方法的作用是分阶段执行 Generator 函数。每次调用 next 方法,会返回一个对象,表示当前阶段的信息( value 属性和 done 属性)
  • value 属性是 yield 语句后面表达式的值,表示当前阶段的值;done 属性是一个布尔值,表示 Generator 函数是否执行完毕,即是否还有下一个阶段。
var d = demo(1);
d.next() // { value: 3, done: false }
d.next() // { value: undefined, done: true }

Generator 函数每次next(),都是执行一次遇到的yield

function* demo(x){
  var y = yield x + 2;
  var y1 = yield y + 100;
}

var d = demo(1);
var res = d.next() // {value: 3, done: false}
d.next(res.value);  // {value: 103, done: false}
  • 变量res为第一个遇到的 yield 语句,返回的对象。由于第二个 yield 语句有用到前一个语句的返回对象,所以在第二次 .next() 中我们要把前一次的value值传进去

Generator 函数执行一个异步操作

  • Generator 函数封装了一个异步操作,先调用一个远程接口,然后从 JSON 格式的数据解析信息
  • 使用 next 方法,执行异步任务的第一阶段,fetch回的是一个 Promise 对象,因此要用 then 方法调用下一个next 方法。
fetch是一个类似ajax的用途
function* demo(){
  var url = 'https://api.github.com/users/github';
  var res = yield fetch(url);
  console.log(result.bio);
}

var d = demo();
var res = d.next();

res.value.then(function(data){
  return data.json();
}).then(function(data){
  d.next(data);
});

Generator 函数数据交换

  • next 方法返回值的 value 属性,是 Generator 函数向外输出数据;next 方法还可以接受参数,这是向 Generator 函数体内输入数据
  • 第二个 next 方法带有参数2,这个参数可以传入 Generator 函数,作为上个阶段异步任务的返回结果,被函数体内的变量 y 接收。因此,这一步的 value 属性,返回的就是2(变量 y 的值)
function* demo(x){
  var y = yield x + 2;
  return y;
}

var d = demo(1);
d.next() // { value: 3, done: false }
d.next(2) // { value: 2, done: true }

结语

前端react QQ群:788023830 ---- React/Redux - 地下老英雄

前端交流 QQ群:249620372 ---- FRONT-END-JS前端

(我们的宗旨是,为了加班,为了秃顶……,仰望大佬),希望小伙伴们加群一起学习