es6--生成器

作者: lvyweb | 来源:发表于2021-06-14 22:20 被阅读0次

1. generator 函数

概念:可以通过yield关键字,将函数挂起,为了改变执行流提供了可能,同时为了做异步编程提供了方案
与普通函数的区别:

    1. function后面,函数名之前有个*
    1. 只能在函数内部使用yield表达式,让函数挂起
function* func(){
    yield 2;
}
// 返回一个遍历器对象,可以调用next()
let oo = func();
console.log(oo);//返回一个对象
console.log(oo.next())//{value: 2, done: false}
console.log(oo.next())//{value: undefined, done: true}

//-----------------------------------------------------------------------------------------

function* func(){
    console.log('one');
    yield 2;
    console.log('two');
    yield 3;
    console.log('end');
}
 let qq = func();
console.log(qq);//func {<suspended>}
console.log(qq.next())//one   {value: 2, done: false}
console.log(qq.next())//two   {value: 3, done: false}
console.log(qq.next())//end   {value: undefined, done: true}

总结:generator函数是分段执行的,yield是暂停执行,而next 恢复执行

function* add(){
    console.log('start');
    // x 不是yield '2'的返回值,是next方法调用,恢复当前yield()执行传入的实参
    let x = yield '2';
    console.log('one:'+x);
    let y = yield '3';
    console.log('two:'+y);
    return x+y;
}
const fn = add();//只是生成一个生成器函数
console.log(fn.next());//start  {value: "2", done: false}
console.log(fn.next(20));//one:20  {value: "3", done: false}
console.log(fn.next(10));//two:10  {value: 30, done: true}

使用场景1:为不具备Interator接口对象提供了遍历操作

function* objectEntries(obj){
    // 获取对象的所有的key保存到数组[age,name]
    const propKeys = Object.keys(obj);
    for(const propkey of propKeys){
        yield [propkey,obj[propkey]]
    }
}

const obj ={
    name:'小玉米',
    age: 8,
}
console.log(obj);
obj[Symbol.iterator] = objectEntries;
console.log(obj);//迭代器生成

for(let [key,value] of objectEntries(obj)){
    console.log(`${key},${value}`);//name,小玉米   age,8
}

使用场景2:数据异步请求

function* main(){
    yield request('https://www.sogou.com/reventondc/inner/vi?op=13&classid=70090206');
    console.log(res);
    //执行后面的操作
    console.log('数据请求完成,可以继续操作');

}

const ite = main();
ite.next();

function request(url){
    $.ajax({
        url,
        method:'get',
        success(res){
            ite.next(res);
            console.log(res)
        }
    })
}

要实现一个:
加載loading... 页面
数据加载完成...
loading关闭掉

function loadUI(){
    console.log('加载loading页面')
}


function showData(){
    setTimeout(()=>{
    console.log('数据加载完成')

    },1000)
}
function hideUI(){
    console.log('隐藏loading...页面')
}

loadUI();
showData();
hideUI();
//加载loading页面
// 隐藏loading...页面
// 数据加载完成
//---------------------------------------------------------------------------
使用Generator模拟异步操作
let itLoad = load();
itLoad.next();
function showData(){
    // 模拟异步操作
    setTimeout(()=>{
    console.log('数据加载完成')
    itLoad.next();//继续执行
    },1000)
}
function* load(){
    loadUI();
    yield showData();
    yield hideUI();
}

Generator作用:部署ajax操作,让异步代码同步化

相关文章

  • es6--生成器

    1. generator 函数 概念:可以通过yield关键字,将函数挂起,为了改变执行流提供了可能,同时为了做异...

  • 深入理解ES6--解构

    深入理解ES6--解构

  • ES6--(8)迭代器与生成器

    循环的问题 迭代器 迭代器是被设计专用于迭代的对象,带有特定接口。所有的迭代器对象都拥有 next() 方法,会返...

  • 2019-10-21Vue脚手架安装命令(mac版)

    安装脚手架的命令(终端) 项目安装(终端安装) babel转译es6-->es5 -安装 babel babel ...

  • 15.生成器generator

    目录:1.生成器介绍2.生成器举例3.生成器应用 1.生成器介绍 生成器指的是生成器对象,可以由生成器表达式得到,...

  • 2018-07-16

    ## 1\. 生成器和生成器函数 ``` 生成器的本质就是迭代器 生成器的三种创建办法: 1.通过生成器函数 ...

  • 第014篇:三大神器之生成器

    Python的三大神器:装饰器、迭代器、生成器 1、生成器 1.1、什么是生成器 生成器就是迭代器的一种;生成器作...

  • Python 生成器函数

    一、生成器 生成器指的是生成器对象,可由生成器表达式得到,也可使用 yield 关键字得到一个生成器函数,调用这个...

  • tornado协程的工作原理

    包含yield语句的函数是一个生成器。所有的生成器都是异步的。当我们调用生成器函数的时候,生成器函数返回一个生成器...

  • python 生成器小结

    作者:邵正将 来源:PytLab 在python中生成器可以很方便的实现迭代协议。生成器通过生成器函数产生,生成器...

网友评论

    本文标题:es6--生成器

    本文链接:https://www.haomeiwen.com/subject/vqxaeltx.html