Generators生成器函数

    1.Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。(异步顺序)

    同步和异步

    javascript语言是一门“单线程”的语言,只有一个主线程,不能同时进行多个任务和流程,同步和异步的差别就在于这条流水线上各个流程的执行顺序不同。

    同步任务指的是阻塞模式,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;

    // for (;;) {}

    // alert(‘我想被执行’);

    此时for循环一直不能终止,那么alert语句就一直不能被执行,也就是线程的执行被阻塞了。

    异步任务指的是,不进入主线程、而进入”任务队列”的任务,只有等主线程任务执行完毕,该任务才会进入主线程执行(定时器是异步)

    // setTimeout(() => {

    // alert(‘我第二个被执行’)

    // }, 5000);

    // alert(‘我想被执行’);

    这里我们会先执行最下面的alert,而定时器函数中的alert会在5S后被执行。

    目前位置定时器是异步的,还有事件也存在异步,不算真正的异步,区分具体的情况。

    同步和异步函数的执行顺序,是同步函数会被加载进主执行栈中,而异步函数会被添加到任务列表中,当异步函数准备完毕后,会在当前主执行栈被清空后加载进主执行栈执行,所以异步函数在未加载完毕前不会阻塞主执行栈中的函数执行,异步函数存在的任务列表,同样执行先进先出的原则。

    2.Generator 函数是一个状态机,封装了多个内部状态。

    3.Generator 函数有两个特征。

    1.function关键字与函数名之间有一个星号;星号存在function和函数名之间即可。 2.函数体内部使用yield(产出)表达式,定义不同的内部状态。 3.yield后面只能跟promise对象。 4.如果想要函数内部状态yield自动执行,不用next切换到下一个状态,就需要从npm上下载一个第三方包 co ,这个包放进Generator函数中,就可以让Generator函数自动执行 使用方法:下载:npm install co -s 引入:const co = require(“co”); 使用,需要写在函数里:co(fn).then(() => {// fn为想要自执行的Generator函数名 返回的内容 })

    异步函数-Generators生成器函数 - 图1

    function*fn() {

    yield’第一个状态’;

    yield’第二个状态’;

    yield’第三个状态’;

    return’最后的状态’//通过return设置最后的状态,也可以没有。

    }

    console.log(fn()); //返回当前Generator函数的所有属性,如果想要获取函数内部的状态需要配合next方法才能获取。

    let gen = fn(); //Generator函数会返回一个遍历器对象,必须调用遍历器对象的next方法

    // next方法会返回value和done两个参数;value:状态的返回值,done:是否还存在状态,等到为true,表示后面不再存在状态

    console.log(gen.next()); //{value: ‘第一个状态’, done: false}

    console.log(gen.next().value); //第二个状态

    console.log(gen.next().done); //false

    console.log(gen.next()); //{value: ‘第二个状态’, done: false}

    console.log(gen.next()); //{value: ‘第三个状态’, done: false}

    console.log(gen.next()); //{value: ‘最后的状态’, done: true}

    console.log(gen.next()); //{value: undefined, done: true}

    console.log(gen.next()); //{value: undefined, done: true}

    console.log(gen.next()); //{value: undefined, done: true}