es6 generator函数

2019-05-05  本文已影响0人  三十六计至做笔记

协程:多个线程互相协作,完成异步任务。

functionasnycJob(){ // ...其他代码varf=yieldreadFile(fileA); // ...其他代码}

Generator 函数是协程在 ES6 的实现,最大特点就是可以交出函数的执行权(即暂停执行)。

function*gen(x){vary=yield x+2;returny;}---------它不同于普通函数,是可以暂停执行的,所以函数名之前要加星号,以示区别。

执行方法:

varg=gen(1);g.next() // { value: 3, done: false }g.next()// { value: undefined, done: true }

Generator 函数不同于普通函数的另一个地方,即执行它不会返回结果,返回的是指针对象。调用指针 g 的 next 方法,会移动内部指针

每次调用 next 方法,会返回一个对象,表示当前阶段的信息( value 属性和 done 属性)。value 属性是 yield 语句后面表达式的值,表示当前阶段的值;done 属性是一个布尔值,表示 Generator 函数是否执行完毕,即是否还有下一个阶段。

function*gen(x){vary=yield x+2;returny;}varg=gen(1);g.next() // { value: 3, done: false }g.next(2) // { value: 2, done: true }

第一个 next 方法的 value 属性,返回表达式 x + 2 的值(3)。第二个 next 方法带有参数2,这个参数可以传入 Generator 函数,作为上个阶段异步任务的返回结果,被函数体内的变量 y 接收。因此,这一步的 value 属性,返回的就是2(变量 y 的值)。

function*gen(x){try{vary=yield x+2;}catch(e){console.log(e);}returny;}varg=gen(1);g.next();g.throw('出错了');// 出错了

Generator 函数体外,使用指针对象的 throw 方法抛出的错误,可以被函数体内的 try ... catch 代码块捕获。这意味着,出错的代码与处理错误的代码,实现了时间和空间上的分离,这对于异步编程无疑是很重要的。

generator 用法

varfetch=require('node-fetch');function*gen(){varurl='https://api.github.com/users/github';varresult=yieldfetch(url);console.log(result.bio);}

varg=gen();varresult=g.next();result.value.then(function(data){returndata.json();}).then(function(data){g.next(data);});

首先执行 Generator 函数,获取遍历器对象,然后使用 next 方法(第二行),执行异步任务的第一阶段。由于 Fetch 模块返回的是一个 Promise 对象,因此要用 then 方法调用下一个next 方法。

上一篇下一篇

猜你喜欢

热点阅读