ES6学习笔记七:生成器与异步操做

一:Generator编程

Generator 函数是一个普通函数,可是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,输出不一样的内部状态。异步

执行 Generator 函数会返回一个遍历器对象,能够依次遍历 Generator 函数内部的每个状态。async

Generator 函数的调用方法与普通函数同样,也是在函数名后面加上一对圆括号。不一样的是,调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象。而后,必须调用遍历器对象的next方法,使得指针移向下一个状态。也就是说,每次调用next方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个yield表达式(或return语句)为止。换言之,Generator 函数是分段执行的,yield表达式是暂停执行的标记,而next方法能够恢复执行异步编程

 

二:生成器与迭代函数

Generator 函数就是遍历器生成函数,所以能够把 Generator 赋值给对象的Symbol.iterator属性,从而使得该对象具备 Iterator 接口。而 Generator中使用yield语句输出被迭代的内容便可。spa

 

三:next方法可传参指针

经过next方法的参数,就有办法在 Generator 函数开始运行以后,继续向函数体内部注入值。也就是说,能够在 Generator 函数运行的不一样阶段,从外部向内部注入不一样的值,从而调整函数行为。code

 

四:生成器的异步应用协程

ES6 之前,异步编程的方法,大概有下面四种。对象

  • 回调函数
  • 事件监听
  • 发布/订阅
  • Promise 对象

 Generator能够经过yield分段执行,其实就是让出cpu使用权,这种特性十分适合用来实现协程。

整个 Generator 函数就是一个封装的异步任务的容器。异步操做须要暂停的地方,都用yield语句让出使用权。

next方法的做用是分阶段执行Generator函数,继续执行异步任务。

 

五:async 函数

async 函数是 Generator 函数的语法糖,进行了更友好的包装。

async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await,仅此而已。

var asyncTask = async function () {
    do...
    await(异步操做);
    do...
    await(异步操做);
   ......
};

async函数对 Generator 函数做出改进:

(1)内置执行器。

Generator 函数的执行必须靠执行器,而async函数自带执行器,该函数一旦被调用就自动执行。

(2)返回值是 Promise。

async函数的返回值是 Promise 对象,你能够用then方法指定下一步的操做。

进一步说,async函数彻底能够看做多个异步操做,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖。

 应用例子:

async function getStockPriceByName(name) {
  var symbol = await getStockSymbol(name);
  var stockPrice = await getStockPrice(symbol);
  return stockPrice;
}

getStockPriceByName('goog').then(function (result) {
  console.log(result);
});
相关文章
相关标签/搜索