Typescript

es6--生成器

2021-06-14  本文已影响0人  lvyweb

1. generator 函数

概念:可以通过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操作,让异步代码同步化

上一篇下一篇

猜你喜欢

热点阅读