亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Javascript中的async awai的用法

2019-11-19 16:34:13
字體:
來源:轉載
供稿:網友

async / await是ES7的重要特性之一,也是目前社區里公認的優秀異步解決方案。目前,async / await這個特性已經是stage 3的建議,可以看看TC39的進度,本篇文章將分享async / await是如何工作的,閱讀本文前,希望你具備Promise、generator、yield等ES6的相關知識。

在詳細介紹async / await之前,先回顧下目前在ES6中比較好的異步處理辦法。下面的例子中數據請求用Node.js中的request模塊,數據接口采用Github v3 api文檔提供的repo代碼倉庫詳情API作為例子演示。

Promise對異步的處理

雖然Node.js的異步IO帶來了對高并發的良好支持,同時也讓“回調”成為災難,很容易造成回調地獄。傳統的方式比如使用具名函數,雖然可以減少嵌套的層數,讓代碼看起來比較清晰。但是會造成比較差的編碼和調試體驗,你需要經常使用用ctrl + f去尋找某個具名函數的定義,這使得IDE窗口經常上下來回跳動。使用Promise之后,可以很好的減少嵌套的層數。另外Promise的實現采用了狀態機,在函數里面可以很好的通過resolve和reject進行流程控制,你可以按照順序鏈式的去執行一系列代碼邏輯了。下面是使用Promise的一個例子:

const request = require('request');// 請求的url和headerconst options = { url: 'https://api.github.com/repos/cpselvis/zhihu-crawler', headers: {  'User-Agent': 'request' }};// 獲取倉庫信息const getRepoData = () => { return new Promise((resolve, reject) => {  request(options, (err, res, body) => {   if (err) {    reject(err);   }   resolve(body);  }); });};getRepoData() .then((result) => console.log(result);) .catch((reason) => console.error(reason););// 此處如果是多個Promise順序執行的話,如下:// 每個then里面去執行下一個promise// getRepoData()//  .then((value2) => {return promise2})//  .then((value3) => {return promise3})//  .then((x) => console.log(x))

不過Promise仍然存在缺陷,它只是減少了嵌套,并不能完全消除嵌套。舉個例子,對于多個promise串行執行的情況,第一個promise的邏輯執行完之后,我們需要在它的then函數里面去執行第二個promise,這個時候會產生一層嵌套。另外,采用Promise的代碼看起來依然是異步的,如果寫的代碼如果能夠變成同步該多好??!

Generator對異步的處理

談到generator,你應該不會對它感到陌生。在Node.js中對于回調的處理,我們經常用的TJ / Co就是使用generator結合promise來實現的,co是coroutine的簡稱,借鑒于python、lua等語言中的協程。它可以將異步的代碼邏輯寫成同步的方式,這使得代碼的閱讀和組織變得更加清晰,也便于調試。

const co = require('co');const request = require('request');const options = { url: 'https://api.github.com/repos/cpselvis/zhihu-crawler', headers: {  'User-Agent': 'request' }};// yield后面是一個生成器 generatorconst getRepoData = function* () { return new Promise((resolve, reject) => {  request(options, (err, res, body) => {   if (err) {    reject(err);   }   resolve(body);  }); });};co(function* () { const result = yield getRepoData; // ... 如果有多個異步流程,可以放在這里,比如 // const r1 = yield getR1; // const r2 = yield getR2; // const r3 = yield getR3; // 每個yield相當于暫停,執行yield之后會等待它后面的generator返回值之后再執行后面其它的yield邏輯。 return result;}).then(function (value) { console.log(value);}, function (err) { console.error(err.stack);});

async / await對異步的處理

雖然co是社區里面的優秀異步解決方案,但是并不是語言標準,只是一個過渡方案。ES7語言層面提供async / await去解決語言層面的難題。目前async / await 在 IE edge中已經可以直接使用了,但是chrome和Node.js還沒有支持。幸運的是,babel已經支持async的transform了,所以我們使用的時候引入babel就行。在開始之前我們需要引入以下的package,preset-stage-3里就有我們需要的async/await的編譯文件。

無論是在Browser還是Node.js端都需要安裝下面的包。

$ npm install babel-core --save$ npm install babel-preset-es2015 --save$ npm install babel-preset-stage-3 --save

這里推薦使用babel官方提供的require hook方法。就是通過require進來后,接下來的文件進行require的時候都會經過Babel的處理。因為我們知道CommonJs是同步的模塊依賴,所以也是可行的方法。這個時候,需要編寫兩個文件,一個是啟動的js文件,另外一個是真正執行程序的js文件。

啟動文件index.js

require('babel-core/register');require('./async.js');

真正執行程序的async.js

const request = require('request');const options = { url: 'https://api.github.com/repos/cpselvis/zhihu-crawler', headers: {  'User-Agent': 'request' }};const getRepoData = () => { return new Promise((resolve, reject) => {  request(options, (err, res, body) => {   if (err) {    reject(err);   }   resolve(body);  }); });};async function asyncFun() { try {  const value = await getRepoData();  // ... 和上面的yield類似,如果有多個異步流程,可以放在這里,比如  // const r1 = await getR1();  // const r2 = await getR2();  // const r3 = await getR3();  // 每個await相當于暫停,執行await之后會等待它后面的函數(不是generator)返回值之后再執行后面其它的await邏輯。  return value; } catch (err) {  console.log(err); }}asyncFun().then(x => console.log(`x: ${x}`)).catch(err => console.error(err));

注意點:

  1. async用來申明里面包裹的內容可以進行同步的方式執行,await則是進行執行順序控制,每次執行一個await,程序都會暫停等待await返回值,然后再執行之后的await。
  2. await后面調用的函數需要返回一個promise,另外這個函數是一個普通的函數即可,而不是generator。
  3. await只能用在async函數之中,用在普通函數中會報錯。
  4. await命令后面的 Promise 對象,運行結果可能是 rejected,所以最好把 await 命令放在 try...catch 代碼塊中。

其實,async / await的用法和co差不多,await和yield都是表示暫停,外面包裹一層async 或者 co來表示里面的代碼可以采用同步的方式進行處理。不過async / await里面的await后面跟著的函數不需要額外處理,co是需要將它寫成一個generator的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久躁日日躁aaaaxxxx| 欧洲亚洲免费视频| 国产精品视频区| 国产成+人+综合+亚洲欧美丁香花| 成人国产精品日本在线| 伊人激情综合网| 国产精品久久久久久影视| 日韩精品视频中文在线观看| 亚洲午夜未满十八勿入免费观看全集| 国产综合香蕉五月婷在线| 国产精品一区二区性色av| 在线激情影院一区| 欧美日韩精品中文字幕| 日韩动漫免费观看电视剧高清| 久久躁日日躁aaaaxxxx| 亚洲人成网站999久久久综合| 国产成人综合av| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲一级黄色av| 欧美日韩xxxxx| 国产精品一区二区三区毛片淫片| 国产欧美久久久久久| 色与欲影视天天看综合网| 欧美日本在线视频中文字字幕| 久久久久久久久久久国产| 日韩在线观看免费全| 日本人成精品视频在线| 久久亚洲精品国产亚洲老地址| 久久夜色精品亚洲噜噜国产mv| 欧美成人激情视频免费观看| 国产99久久精品一区二区永久免费| 欧美日韩免费一区| 国产91精品久久久久久| 欧美高清视频一区二区| 成人亲热视频网站| 欧美黑人极品猛少妇色xxxxx| 亚洲精品午夜精品| 成人有码在线视频| 国产精品电影一区| 久久久999精品免费| 91日韩在线播放| 国产v综合ⅴ日韩v欧美大片| 欧美激情综合色| 午夜精品久久久久久久白皮肤| 久久不射热爱视频精品| 精品国产一区二区在线| 午夜免费久久久久| 欧美日韩国产中文精品字幕自在自线| 中文字幕亚洲一区二区三区五十路| 国产精品视频一区国模私拍| 国产精品国产三级国产aⅴ浪潮| 中文字幕国产日韩| 国产热re99久久6国产精品| 久久久免费在线观看| 91av视频在线观看| 欧美一级大片视频| 亚洲欧美在线免费观看| 国产性色av一区二区| 国产精品第三页| 亚洲精品一区二区三区不| 成人性生交大片免费看小说| 亚洲国产精品yw在线观看| 色综合久久精品亚洲国产| 777777777亚洲妇女| 久久久久久久香蕉网| 欧美激情一区二区三区在线视频观看| 亚洲国产欧美一区| 亚州国产精品久久久| 国产精品日本精品| 亚洲free嫩bbb| 国产精品福利观看| 欧美性猛交xxxx乱大交| 日韩电影免费观看在线观看| 在线精品国产欧美| 国产欧美韩国高清| 国产91精品黑色丝袜高跟鞋| 亚洲午夜未满十八勿入免费观看全集| 91免费国产网站| 国产午夜精品一区理论片飘花| 宅男66日本亚洲欧美视频| 成人午夜在线影院| 亚洲欧美成人网| 日韩av毛片网| 性色av一区二区三区红粉影视| 亚洲人成网站999久久久综合| 91九色视频在线| 中文字幕亚洲无线码a| 亚洲色图第一页| 日韩美女av在线免费观看| 欧美激情久久久| 91理论片午午论夜理片久久| 国产精品国产自产拍高清av水多| 久久久人成影片一区二区三区观看| 亚洲欧美日韩久久久久久| 中文字幕在线观看亚洲| 国产suv精品一区二区| 韩剧1988免费观看全集| 欧美一级在线播放| 伊人久久综合97精品| 日韩一区二区三区xxxx| 日韩精品在线观看一区| 国产精品视频白浆免费视频| 国产日韩欧美一二三区| 日韩电影在线观看免费| 黑人巨大精品欧美一区二区三区| 国产日韩精品入口| 一本色道久久综合狠狠躁篇怎么玩| 欧美一级bbbbb性bbbb喷潮片| 人妖精品videosex性欧美| 欧美视频裸体精品| 日韩av一区在线| 精品日本美女福利在线观看| 亚洲精品免费av| 97精品国产97久久久久久| 欧美日韩另类字幕中文| 日韩在线观看网站| 精品视频9999| 久久久97精品| 日本91av在线播放| 5252色成人免费视频| 国产视频精品一区二区三区| 久久久久久久999精品视频| 日韩精品在线免费观看| 91精品中文在线| 久久不射电影网| 亚洲人成在线一二| 日韩在线免费视频| 中文字幕日韩欧美在线视频| 日本19禁啪啪免费观看www| 国产精品老女人视频| 欧洲中文字幕国产精品| 亚洲色图五月天| 久久久久一本一区二区青青蜜月| 上原亚衣av一区二区三区| 66m—66摸成人免费视频| 久久久久久久国产精品| 国产精品av在线| 国产一区二区三区18| 日本乱人伦a精品| 日韩在线观看免费高清完整版| 亚洲成人激情在线| 亚洲一区二区三区香蕉| 欧美国产日韩一区二区三区| 久久精彩免费视频| 亚洲欧美综合区自拍另类| 亚洲国产精品久久精品怡红院| 日韩国产精品一区| 欧美专区在线播放| 久久国产精品久久精品| 久久精品国产欧美激情| 亚洲国产小视频| 精品久久久久久中文字幕一区奶水| 欧美激情网友自拍| 亚洲欧美国内爽妇网| 欧美日韩国产区| 精品无码久久久久久国产| 色无极亚洲影院| 欧美午夜电影在线| 岛国av在线不卡| 亚洲www永久成人夜色| 久久精品国产69国产精品亚洲| 亚洲男人第一av网站| 亚洲天堂男人天堂女人天堂| 欧美成人免费在线观看|