麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > 深入淺出ES6——async函數

深入淺出ES6——async函數

來源:千鋒教育
發布人:wjy
時間: 2023-01-06 11:34:00 1672976040

  ES2017 標準引入了 async 函數,使得異步操作變得更加方便。

  async 函數是什么?一句話,它就是 Generator 函數的語法糖。研究 async 的原理,就必須先弄清楚 Generator 是個啥。

  Generator 函數是 ES6 提供的一種異步編程解決方案,語法行為與傳統函數完全不同。

  形式上,Generator 函數是一個普通函數,但是有兩個特征。一是,function關鍵字與函數名之間有一個星號;二是,函數體內部使用yield表達式,定義不同的內部狀態(yield在英語里的意思就是“產出”)

  看一個例子:

  function* gen(x) { var y = yield x + 2; return y;}var g = gen(1);g.next() // { value: 3, done: false }g.next() // { value: undefined, done: true }

  上面代碼中,調用 Generator 函數,會返回一個內部指針(即遍歷器)g。這是 Generator 函數不同于普通函數的另一個地方,即執行它不會返回結果,返回的是指針對象。調用指針g的next方法,會移動內部指針(即執行異步任務的第一段),指向第一個遇到的yield語句,上例是執行到x + 2為止。

  換言之,next方法的作用是分階段執行Generator函數。每次調用next方法,會返回一個對象,表示當前階段的信息(value屬性和done屬性)。value屬性是yield語句后面表達式的值,表示當前階段的值;done屬性是一個布爾值,表示 Generator 函數是否執行完畢,即是否還有下一個階段。

  這樣手工的執行next()函數,著實有些麻煩,能寫個工具讓他自動執行嗎?那我們就來試試:

  封裝一個 spawn 函數,返回一個 spawn 函數,給函數傳入 Generator函數作為參數,spawn 實現 next() 方法的執行。

  function fn(args) { return spawn(function* () { // ... });}

  spawn 函數的實現:

  function spawn(genF) { return new Promise(function(resolve, reject) { const gen = genF(); function step(nextF) { let next; try { next = nextF(); } catch(e) { return reject(e); } if(next.done) { return resolve(next.value); } Promise.resolve(next.value).then(function(v) { step(function() { return gen.next(v); }); }, function(e) { step(function() { return gen.throw(e); }); }); } step(function() { return gen.next(undefined); }); });}

  應用這個方法執行一下第一個例子:

  function fn(x) { return spawn(function* gen() { var y = yield x + 2 return y; });}fn(1).then((result) => { console.log(result) // 3})

  如果 yield 后面是個 Promise, 就可以實現異步了:

  function fn(x) { return spawn(function* gen() { var y = yield new Promise((resolve) => { setTimeout(() => { resolve(x + 1) }, 1000) }) return y; });}fn(1).then((result) => { console.log(result) // 過一秒后打印 3})

  這樣,過一秒后就打印 3 了。

  從整個代碼上來看,實現起來有些麻煩。Async 簡化了一切,使用它,不再需要 spawn 函數,只需將 Generator 函數的星號(*)替換成async,將yield替換成await,僅此而已。改造一下:

  async function fn(x) { let result = await new Promise((resolve) => { setTimeout(() => { resolve(x + 2) }, 1000) }) return result}fn(1).then((result) => { console.log(result)})

  真是簡潔了很多。

  最后看一個面試題,如何將程序的執行結果 1,3,2,改造為 1,2, 3

  

hello world

 

  只需修改一個 onGetUser 函數即可:

  async onGetUser() { // getUser().then((result) => { // console.log(result) // }) let result = await getUser() console.log(result)}

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
開班信息
北京校區
  • 北京校區
  • 大連校區
  • 廣州校區
  • 成都校區
  • 杭州校區
  • 長沙校區
  • 合肥校區
  • 南京校區
  • 上海校區
  • 深圳校區
  • 武漢校區
  • 鄭州校區
  • 西安校區
  • 青島校區
  • 重慶校區
  • 太原校區
  • 沈陽校區
  • 南昌校區
  • 哈爾濱校區
主站蜘蛛池模板: www..com色| 伊人久久精品一区二区三区| 国产va免费精品观看精品| 一级毛片看**在线视频| 国产日韩欧美亚洲| 伦理一区二区三区| 2022国产精品最新在线| 午夜无遮挡羞羞漫画免费| 欧美卡一卡2卡三卡4卡在线| 美女免费视频一区二区三区| 久久天天躁狠狠躁夜夜不卡| 国产精品成人va在线观看| 午夜a级理论片在线播放| 美女脱了内裤打开腿让你桶爽| 国产亚洲人成网站在线观看| 国产欧美日韩精品a在线观看| 色播成人网| chinese国产xxxx实拍| 国产悠悠视频在线播放| 久久er99热精品一区二区| 久久午夜神器| 538精品在线视频| 老鸭窝在线播放| 亚洲欧美日韩成人一区在线| 久久精品国产亚洲精品2020| 波多野结衣不打码视频| 99久久精品免费精品国产| 伊人久久精品一区二区三区| 成人永久免费高清| 国产成人精品一区二三区| 国产嫩草在线观看| 久久国产成人精品国产成人亚洲| 久草福利资源站| 中文国产成人精品久久一区| 131美女爽爽爽爱做视频| 麻豆网站免费| 青青青青青免精品视频| 色噜噜狠狠色综合免费视频| 小东西几天没做怎么这么多水| 免费的黄色影片| 久久久久夜夜夜精品国产|