1-1 基本概念

  1. Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。
  2. 执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。
  1. 形式上,Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。
  2. function* helloWorldGenerator() {
  3. yield 'hello';
  4. yield 'world';
  5. return 'ending';
  6. }
  7. var hw = helloWorldGenerator();

1-2 yield 表达式

  1. 由于 Generator 函数返回的遍历器对象,只有调用next方法才会遍历下一个内部状态,所以其实提供了一种可以暂停执行的函数。yield表达式就是暂停标志。

1-3 Generator 函数的异步应用

  1. 整个 Generator 函数就是一个封装的异步任务,或者说是异步任务的容器。异步操作需要暂停的地方,都用yield语句注明。

异步任务的封装

  1. var fetch = require('node-fetch');
  2. function* gen(){
  3. var url = 'https://api.github.com/users/github';
  4. var result = yield fetch(url);
  5. console.log(result.bio);
  6. }
  7. 上面代码中,Generator 函数封装了一个异步操作,该操作先读取一个远程接口,然后从 JSON 格式的数据解析信息。就像前面说过的,这段代码非常像同步操作,除了加上了yield命令。
  1. async 函数是什么?一句话,它就是 Generator 函数的语法糖。
  2. 一比较就会发现,async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await,仅此而已。