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


    一:Generator

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

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

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

    二:生成器与迭代

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

    三:next方法可传参

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

    四:生成器的异步应用

    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);
    });
  • 相关阅读:
    梅森数 洛谷p1045
    高精度算法
    并查集(算法)
    各种背包模板
    爬虫作业
    numpy、scipy、pandas、matplotlib的读书报告:
    体育竞技分析羽毛球
    聊斋相关的分词,出现次数最高的20个
    在终端输出如下信息,(两种以上方法)
    7段数码管绘制
  • 原文地址:https://www.cnblogs.com/ygj0930/p/7248469.html
Copyright © 2020-2023  润新知