ES6之Generator 函数的异步应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6之Generator 函数的异步应用相关的知识,希望对你有一定的参考价值。

参考技术A 内部的 next 函数就是 Thunk 的回调函数。 next 函数先将指针移到 Generator 函数的下一步( gen.next 方法),然后判断 Generator 函数是否结束( result.done 属性),如果没结束,就将 next 函数再传入 Thunk 函数( result.value 属性),否则就直接退出。每一个异步操作,都要是 Thunk 函数,即跟在yield命令后面的必须是 Thunk 函数

用于 Generator 函数的自动执行,不用编写 Generator 函数的执行器

ES6之Generator

  Generator函数是一种异步编程解决方案,再次叙述他的语法和API,至于异步编程请看后续文章。

  Generator本身自带Iterator接口,所以可以使用for...of,个人理解为Generator是一个指针代码块,里面封装了指针,使用next()就开始执行指针所指向的函数。这个函数有两个特征:一是function命令与函数名之间有一个*号,二是函数体内部使用yield语句定义不同的内部状态。

function* sayhi() { 
    yield ‘this‘; 
    yield ‘is‘; 
    yield ‘Generator‘; 
    return ‘加载完毕‘;        //return方法返回最终给定的值并终结Generator函数的遍历
}
for(let g of sayhi()){ 
    console.log(g);         //this is Generator
} 
var hi = sayhi(); 
    console.log(hi.next());         //{ value: ‘this‘, done: false }
console.log(hi.next());         //{ value: ‘is‘, done: false }
console.log(hi.next());         //{ value: ‘Generator‘, done: false }
console.log(hi.next());        //{ value: ‘加载完毕‘, done: true }
/* 当然Generator那个*号有4种写法 比如  function* functionName 或者是 function * functionName或者是function *functionName再或者是function*functionName当然这玩意是自己怎么写开心就怎么写*/

  yield在这里面可以理解为就是指针指向某些函数或者值,yield语句就是暂停标志他只能用在Generator函数里面不能用在普通函数内部,如果yield语句用在一个表达式中,必须放在()里面。Generator函数只有使用next()才可以使他接着向下走,如果在Generator不用yield那么就会变成了一个暂缓函数,只有next()才开始执行该函数,单纯的调用没什么用。如果要在一个Generator里面调用另一个Generator,那么就得使用*号,例如function* a(){ yield* b() } function* b(){}

  next()方法可以带一个参数,该参数会被当做上一条yield语句的返回值,但是第一次使用next()不能带参数,因为V8引擎会直接忽略第一次使用next方法时的参数,如果非要用可以在Generator函数外面再包一层。

function wrapper(generatorFunction) { 
    return function (...args) { 
        let generatorObject = generatorFunction(...args); 
                          generatorObject.next(); 
        return generatorObject; 
    }; 
} 
const wrapped = wrapper(function* () { 
    console.log(`第一次输入的是:${yield}`);    //第一次输入的是:hello 
    return ‘DONE‘; 
}); 
console.log(wrapped().next(‘hello‘));            //{ value: ‘DONE‘, done: true }    

  Generator函数返回的遍历器对象都有一个throw方法,可以在函数体外抛出错误,然后在Generator函数体内捕获,注意throw方法不等于throw命令,throw命令抛出的异常只能被函数体外的catch语句捕获,而throw方法能在函数内部或者函数外部捕获异常。

var g = function *() { 
    while(true){ 
        try{ 
            yield; 
    }catch(e){ 
        if(e != ‘a‘) throw e ; 
        console.log(‘内部捕获‘,e);    //内部捕获 a
    }     
    } 
}; 
var i = g(); 
i.next(); 
try{ 
    i.throw(‘a‘); 
    i.throw(‘b‘); 
}catch(e){ 
    console.log(‘外部捕获‘,e);             //内部捕获 b
}

 

 

    

以上是关于ES6之Generator 函数的异步应用的主要内容,如果未能解决你的问题,请参考以下文章

ES6 之 async 异步函数

ES6之Generator

ES6中generator(生成器)函数的应用

es6之Generator

ES6知识点整理之----Generator----概述

es6-异步应用