国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

ES6 Generator函數(shù)的應(yīng)用實例分析

2024-05-06 16:52:47
字體:
供稿:網(wǎng)友

本文實例講述了ES6 Generator函數(shù)的應(yīng)用。分享給大家供大家參考,具體如下:

Generator 函數(shù)是 一種異步編程解決方案,Generator 函數(shù)會返回一個遍歷器對象,Generator 函數(shù)是一個普通函數(shù),但是有兩個特征。一是,function關(guān)鍵字與函數(shù)名之間有一個星號;二是,函數(shù)體內(nèi)部使用yield表達式。

認識generator函數(shù)

function * fn() { console.log('hello'); return 'Joh';}// 執(zhí)行fn()時不會直接執(zhí)行方法體中的代碼,它會返回一個指針, 這個指針實現(xiàn)了 interator接口,也就是返回一個interator對象let it = fn();// 通過調(diào)用next就會執(zhí)行方法體, 返回結(jié)果是 {value:'Joh', done:true}, 其中next返回的是函數(shù)體中return的值let res = it.next();console.log(res);

generator函數(shù)中的yield 與 return

function * fn() {  // 和yield相配合,把一個generator內(nèi)部分為幾個斷點來執(zhí)行,每個斷點就是yield語句  // 注意 yield和return的區(qū)別: yield可以有多個,return只能有1個  yield 1;  yield 2;  yield 3;  return 4; // 可以沒有return值,done為true的value將會是undefined}let it = fn();// 在for-of 循環(huán)中只能打印done為false的value值,done為true時,程序終止for(let v of it) {  console.log(v); // 分別輸出 1 2 3}

yield 的值與賦值語句

function * fn(_name) { let name = yield _name; // yield 的默認值為undefined return name;}let it = fn('Joh');console.log(it.next()); // {value:'Joh', done:false}console.log(it.next('Tom')); // {value:'Tom', done:true} // 此處value應(yīng)該為undefined,但是通過next參數(shù)的形式賦值改變了最后一個值console.log(it.next('Lily')); // {value: undefined, done:true} // 已經(jīng)循環(huán)完畢,即使傳值也是undefined

yield 語句的位置與括號

function sum(a, b) { return a + b;}function * fn() { let res = sum(yield 1, 5 + (yield 3)); console.log(res); console.log('my qq: ' + (yield qq)); // yield 在一個語句中需要括起來}fn();

yield 異常捕獲

異常捕獲的方式1:

function * fn() { let qq = yield; // yield 默認返回undefined, 不會拋出異常 console.log(qq);}let g = fn();g.next(); // 第一個斷點沒有輸出// g.next('qq 11111'); // 完畢之后傳值輸出:qq 11111g.throw('error!'); // Uncaught error!

異常捕獲的方式2:

function * fn() { let qq; try {  qq = yield; // yield 默認返回undefined }catch(e){  console.log('qq have error'); }finally{  console.log(qq); }}let g = fn();g.next();g.throw('error!');// qq have error// undefined

異常捕獲的方式3:

function * fn() { let qq; qq = yield; console.log(qq);}let g = fn();g.next();try{ g.throw('error!');}catch(e){ console.log('qq have error!');}

異常捕獲的方式4:

function * fn() { let qq; try {  qq = yield ff; // ff 未定義, 所以qq不會被正確賦值 此處是非 yield 的異常 }catch(e){  console.log('err1'); } console.log(qq);}let g = fn();g.next();g.next('qq 5554');// err1// undefined

利用generator和promise結(jié)合使用,讓異步的邏輯關(guān)系,使用同步的方式書寫

function asyncF(name) { return new Promise(function(resolve){  setTimeout(function(){   resolve('my name is ' + name);  }); });}function * fn() { console.log(yield asyncF('Joh'));}let gf = fn();function exec(gf,value) { let res = gf.next(value); if(!res.done) {  if(res.value instanceof Promise) {   res.value.then(function (v) {    exec(gf, v);   })  }else{   exec(gf, res.value);  } }}exec(gf); // my name is Joh

更復(fù)雜的寫法:

function asyncF(name) { return new Promise(function(resolve){  setTimeout(function(){   resolve('my name is ' + name);  }); });}function sum(a, b) { return new Promise(function (resolve) {  setTimeout(function () {    resolve(a + b);  }); })}function * fn(name) { if((yield sum(3,5)) > 6) {  console.log(yield asyncF(name)); }else{  console.log('error'); }}let gf = fn('Joh');// generator 執(zhí)行器 相當(dāng)于 tj/co 模塊function exec(gf,value) { let res = gf.next(value); if(!res.done) {  if(res.value instanceof Promise) {   res.value.then(function (v) {    exec(gf, v);   })  }else{   exec(gf, res.value);  } }}exec(gf); // my name is Joh

使用純promise實現(xiàn):

function asyncF(name) { return new Promise(function(resolve){  setTimeout(function(){   resolve('my name is ' + name);  }); });}function sum(a, b) { return new Promise(function (resolve) {  setTimeout(function () {    resolve(a + b);  }); })}function fn(name) { sum(3,5)  .then(function (num) {   if(num > 6) {    asyncF(name)     .then(function (v) {      console.log(v);     })   }else{    console.log('error');   }  })}fn('Joh');

使用co模塊,來代替自己寫的執(zhí)行器

var co = require('co');function asyncF(name) { return new Promise(function(resolve){  setTimeout(function(){   resolve('my name is ' + name);  }); });}function sum(a, b) { return new Promise(function (resolve) {  setTimeout(function () {    resolve(a + b);  }); })}function * fn(name) { if((yield sum(3,5)) > 6) {  console.log(yield asyncF(name)); }else{  console.log('error'); }}var fnx = co.wrap(fn);fnx('Joh'); // my name is Joh

希望本文所述對大家JavaScript程序設(shè)計有所幫助。


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 定边县| 阜城县| 建水县| 沭阳县| 合肥市| 苏尼特右旗| 余姚市| 宁远县| 普兰县| 兖州市| 施甸县| 广灵县| 会同县| 科技| 镇宁| 定陶县| 黄浦区| 新竹县| 石阡县| 湘西| 平邑县| 丁青县| 通州市| 富源县| 巴青县| 桐庐县| 玉门市| 南溪县| 金寨县| 色达县| 英德市| 金沙县| 界首市| 凤山市| 略阳县| 金山区| 葫芦岛市| 长沙县| 新余市| 綦江县| 定边县|