协程:多个线程互相协作,完成异步任务。
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 方法。
网友评论