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

首頁 > 開發 > JS > 正文

深入理解js 中async 函數的含義和用法

2024-05-06 16:44:17
字體:
來源:轉載
供稿:網友

一、終極解決

異步操作是 JavaScript 編程的麻煩事,麻煩到一直有人提出各種各樣的方案,試圖解決這個問題。

從最早的回調函數,到 Promise 對象,再到 Generator 函數,每次都有所改進,但又讓人覺得不徹底。它們都有額外的復雜性,都需要理解抽象的底層運行機制。

異步I/O不就是讀取一個文件嗎,干嘛要搞得這么復雜?異步編程的最高境界,就是根本不用關心它是不是異步。

async 函數就是隧道盡頭的亮光,很多人認為它是異步操作的終極解決方案。

二、async 函數是什么?

一句話,async 函數就是 Generator 函數的語法糖。

前文有一個 Generator 函數,依次讀取兩個文件。

var fs = require('fs');var readFile = function (fileName){ return new Promise(function (resolve, reject){  fs.readFile(fileName, function(error, data){   if (error) reject(error);   resolve(data);  }); });};var gen = function* (){ var f1 = yield readFile('/etc/fstab'); var f2 = yield readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString());};

寫成 async 函數,就是下面這樣。

var asyncReadFile = async function (){ var f1 = await readFile('/etc/fstab'); var f2 = await readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString());};

一比較就會發現,async 函數就是將 Generator 函數的星號(*)替換成 async,將 yield 替換成 await,僅此而已。

三、async 函數的優點

async 函數對 Generator 函數的改進,體現在以下三點。

(1)內置執行器。 Generator 函數的執行必須靠執行器,所以才有了 co 函數庫,而 async 函數自帶執行器。也就是說,async 函數的執行,與普通函數一模一樣,只要一行。

var result = asyncReadFile();

(2)更好的語義。 async 和 await,比起星號和 yield,語義更清楚了。async 表示函數里有異步操作,await 表示緊跟在后面的表達式需要等待結果。

(3)更廣的適用性。 co 函數庫約定,yield 命令后面只能是 Thunk 函數或 Promise 對象,而 async 函數的 await 命令后面,可以跟 Promise 對象和原始類型的值(數值、字符串和布爾值,但這時等同于同步操作)。

四、async 函數的實現

async 函數的實現,就是將 Generator 函數和自動執行器,包裝在一個函數里。

async function fn(args){ // ...}// 等同于function fn(args){  return spawn(function*() {  // ... }); }

所有的 async 函數都可以寫成上面的第二種形式,其中的 spawn 函數就是自動執行器。

下面給出 spawn 函數的實現,基本就是前文自動執行器的翻版。

function spawn(genF) { return new Promise(function(resolve, reject) {  var gen = genF();  function step(nextF) {   try {    var 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); }); });}

async 函數是非常新的語法功能,新到都不屬于 ES6,而是屬于 ES7。目前,它仍處于提案階段,但是轉碼器 Babel 和 regenerator 都已經支持,轉碼后就能使用。

五、async 函數的用法

同 Generator 函數一樣,async 函數返回一個 Promise 對象,可以使用 then 方法添加回調函數。當函數執行的時候,一旦遇到 await 就會先返回,等到觸發的異步操作完成,再接著執行函數體內后面的語句。

下面是一個例子。

async function getStockPriceByName(name) { var symbol = await getStockSymbol(name); var stockPrice = await getStockPrice(symbol); return stockPrice;}getStockPriceByName('goog').then(function (result){ console.log(result);});

上面代碼是一個獲取股票報價的函數,函數前面的async關鍵字,表明該函數內部有異步操作。調用該函數時,會立即返回一個Promise對象。

下面的例子,指定多少毫秒后輸出一個值。

function timeout(ms) { return new Promise((resolve) => {  setTimeout(resolve, ms); });}async function asyncPrint(value, ms) { await timeout(ms); console.log(value)}asyncPrint('hello world', 50);

上面代碼指定50毫秒以后,輸出"hello world"。

六、注意點

await 命令后面的 Promise 對象,運行結果可能是 rejected,所以最好把 await 命令放在 try...catch 代碼塊中。

async function myFunction() { try {  await somethingThatReturnsAPromise(); } catch (err) {  console.log(err); }}// 另一種寫法async function myFunction() { await somethingThatReturnsAPromise().catch(function (err){  console.log(err); });}

await 命令只能用在 async 函數之中,如果用在普通函數,就會報錯。

async function dbFuc(db) { let docs = [{}, {}, {}]; // 報錯 docs.forEach(function (doc) {  await db.post(doc); });}

上面代碼會報錯,因為 await 用在普通函數之中了。但是,如果將 forEach 方法的參數改成 async 函數,也有問題。

async function dbFuc(db) { let docs = [{}, {}, {}]; // 可能得到錯誤結果 docs.forEach(async function (doc) {  await db.post(doc); });}

上面代碼可能不會正常工作,原因是這時三個 db.post 操作將是并發執行,也就是同時執行,而不是繼發執行。正確的寫法是采用 for 循環。

async function dbFuc(db) { let docs = [{}, {}, {}]; for (let doc of docs) {  await db.post(doc); }}

如果確實希望多個請求并發執行,可以使用 Promise.all 方法。

async function dbFuc(db) { let docs = [{}, {}, {}]; let promises = docs.map((doc) => db.post(doc)); let results = await Promise.all(promises); console.log(results);}// 或者使用下面的寫法async function dbFuc(db) { let docs = [{}, {}, {}]; let promises = docs.map((doc) => db.post(doc)); let results = []; for (let promise of promises) {  results.push(await promise); } console.log(results);}

總結

以上所述是小編給大家介紹的js 中async 函數的含義和用法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲性生活视频在线观看| 日韩视频免费看| 97精品国产97久久久久久春色| 久久久久中文字幕| 久久综合伊人77777尤物| 尤物九九久久国产精品的分类| 国产成人精品网站| 精品福利在线观看| 国产精品美女久久久久av超清| 日韩在线观看免费网站| 68精品久久久久久欧美| 日韩中文字幕不卡视频| 亚洲国产一区二区三区四区| 亚洲老头老太hd| 日韩av成人在线观看| 欧美特黄级在线| 久久国产精品亚洲| 欧美大尺度激情区在线播放| 2019中文字幕在线| 欧美日韩午夜剧场| 久久全球大尺度高清视频| 性欧美在线看片a免费观看| 九九精品视频在线| 日本精品性网站在线观看| 亚洲国产成人精品久久久国产成人一区| 综合网日日天干夜夜久久| 国产精品专区一| 亚洲福利视频在线| 亚洲欧美中文字幕| 亚洲欧美日韩国产成人| 久久精品国产久精国产思思| 久久精品亚洲一区| 日韩中文av在线| 91九色在线视频| 亚洲韩国欧洲国产日产av| 亚洲美女又黄又爽在线观看| 18久久久久久| 一区二区三区回区在观看免费视频| 亚洲免费电影一区| 少妇高潮久久77777| 日本久久久久久| 欧美在线性爱视频| 国产精品久在线观看| 在线日韩av观看| 亚洲精品视频中文字幕| 欧美成人免费大片| 久久99精品久久久久久琪琪| 夜夜狂射影院欧美极品| 精品成人在线视频| 亚洲欧美国内爽妇网| 亚洲女人被黑人巨大进入al| 欧美精品第一页在线播放| 成人精品在线视频| 国产精品入口日韩视频大尺度| 亚洲激情自拍图| 国产亚洲视频在线| 92版电视剧仙鹤神针在线观看| 欧美中文字幕精品| 97色在线播放视频| 韩国欧美亚洲国产| 久久精品视频播放| 亚洲综合一区二区不卡| www.久久久久| 亚洲第一二三四五区| 日韩av中文字幕在线免费观看| 色婷婷**av毛片一区| 日韩欧美中文字幕在线观看| 97视频在线看| 精品久久久免费| 欧美高清视频一区二区| 国产精品午夜国产小视频| 亚洲欧美国产一本综合首页| 国产美女久久精品| 91色精品视频在线| 欧美国产日韩中文字幕在线| 成人亚洲欧美一区二区三区| 福利视频一区二区| 日本午夜精品理论片a级appf发布| 欧美在线国产精品| 日韩电影中文字幕在线| 日本久久久久久久久| 色久欧美在线视频观看| 国产成人精品免费久久久久| 亚洲伊人久久大香线蕉av| 日本精品一区二区三区在线播放视频| 2019中文字幕在线| 亚洲天堂一区二区三区| 亚洲男人第一av网站| www亚洲欧美| 久久久久这里只有精品| 国产日韩精品在线观看| 欧美精品videos另类日本| 欧美xxxx18性欧美| 国产精品久久久久久久av大片| 精品国产自在精品国产浪潮| 亚洲free嫩bbb| 色av中文字幕一区| 久久久中精品2020中文| 色妞久久福利网| 欧美性猛交xxxxx免费看| 97色在线观看免费视频| 国模精品视频一区二区| 成人精品一区二区三区电影黑人| 成人h片在线播放免费网站| 亚洲精品视频久久| 最新国产成人av网站网址麻豆| 欧洲成人免费aa| 在线观看国产成人av片| 欧美亚洲另类激情另类| 久久久综合av| 日韩在线观看免费| 精品国产1区2区| 成人动漫网站在线观看| 国产精品极品美女粉嫩高清在线| 欧美精品一区二区免费| 国产欧美久久久久久| 欧美日韩中文字幕在线| 中文精品99久久国产香蕉| 亚洲午夜未满十八勿入免费观看全集| 成人国产在线激情| 91麻豆桃色免费看| 欧美精品一区在线播放| 自拍偷拍亚洲在线| 久久精品久久久久| 欧美主播福利视频| 国产精品草莓在线免费观看| 91免费电影网站| 91精品国产电影| 欧美性猛交xxxx乱大交蜜桃| 久久久www成人免费精品| 色与欲影视天天看综合网| 欧美日韩国产成人在线| 亚洲激情在线观看| 日韩中文字幕国产| 国产一区二区日韩精品欧美精品| 在线播放国产一区中文字幕剧情欧美| 亚洲美女av在线播放| 一区二区欧美激情| 久久免费国产精品1| 精品国产一区二区三区久久| 自拍视频国产精品| 性色av一区二区三区红粉影视| 国产丝袜精品第一页| 国产在线拍偷自揄拍精品| 欧美激情精品久久久久久蜜臀| 久久中文字幕国产| 国产精品老女人视频| 久久精品成人欧美大片古装| 精品久久久久久久久久国产| 日日狠狠久久偷偷四色综合免费| 成人午夜在线视频一区| 尤物99国产成人精品视频| 国产精品91免费在线| 国产成人精品免高潮在线观看| 欧美精品情趣视频| 国产精品一区二区女厕厕| 日韩欧美精品中文字幕| 精品成人av一区| 亚洲护士老师的毛茸茸最新章节| 国产一区二区三区免费视频| 亚洲精品动漫久久久久| 久久久国产精品视频| 97在线观看视频国产| 国产在线视频欧美|