亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript的async 的學(xué)習(xí)

Leo_chen / 1195人閱讀

摘要:函數(shù)內(nèi)部語句返回的值,會成為方法回調(diào)函數(shù)的參數(shù)。也就是說,只有函數(shù)內(nèi)部的異步操作執(zhí)行完,才會執(zhí)行方法指定的回調(diào)函數(shù)。命令后面的對象如果變?yōu)闋顟B(tài),則的參數(shù)會被方法的回調(diào)函數(shù)接收到。

async 函數(shù)

ES2017 標(biāo)準(zhǔn)引入了 async 函數(shù),使得異步操作變得更加方便,就是 Generator 函數(shù)的語法糖。
對比一下:

const fs = require("fs");

const readFile = function (fileName) {
  return new Promise(function (resolve, reject) {
    fs.readFile(fileName, function(error, data) {
      if (error) return reject(error);
      resolve(data);
    });
  });
};

const gen = function* () {
  const f1 = yield readFile("/etc/fstab");
  const f2 = yield readFile("/etc/shells");
  console.log(f1.toString());
  console.log(f2.toString());
};

async的書寫

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

async函數(shù)就是將 Generator 函數(shù)的星號(*)替換成async,將yield替換成await,僅此而已。

async的優(yōu)點(diǎn)

async的書寫方式,比之前的promise、genenator方式都好,以下四點(diǎn)優(yōu)勢:

內(nèi)置執(zhí)行器。
async函數(shù)的執(zhí)行,與普通函數(shù)一模一樣,只要一行。function(),這樣就可以執(zhí)行,不像 Generator 函數(shù),需要調(diào)用next方法,或者用co模塊,才能真正執(zhí)行,得到最后結(jié)果。

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

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

返回值是 Promise
async函數(shù)的返回值是 Promise 對象,這比 Generator 函數(shù)的返回值是 Iterator 對象方便多了。你可以用then方法指定下一步的操作。

進(jìn)一步說,async函數(shù)完全可以看作多個異步操作,包裝成的一個 Promise 對象,而await命令就是內(nèi)部then命令的語法糖。

返回值

async函數(shù)返回一個 Promise 對象。async函數(shù)內(nèi)部return語句返回的值,會成為then方法回調(diào)函數(shù)的參數(shù)。

async function f() {
  return "hello world";
}

f().then(v => console.log(v))
// "hello world"

上面代碼中,函數(shù)f內(nèi)部return命令返回的值,會被then方法回調(diào)函數(shù)接收到。async函數(shù)內(nèi)部拋出錯誤,會導(dǎo)致返回的 Promise 對象變?yōu)閞eject狀態(tài)。拋出的錯誤對象會被catch方法回調(diào)函數(shù)接收到。

async函數(shù)返回的 Promise 對象,必須等到內(nèi)部所有await命令后面的 Promise 對象執(zhí)行完,才會發(fā)生狀態(tài)改變,除非遇到return語句或者拋出錯誤。也就是說,只有async函數(shù)內(nèi)部的異步操作執(zhí)行完,才會執(zhí)行then方法指定的回調(diào)函數(shù)。

await

正常情況下,await命令后面是一個 Promise 對象。如果不是,會被轉(zhuǎn)成一個立即resolve的 Promise 對象。上面代碼中,await命令的參數(shù)是數(shù)值123,它被轉(zhuǎn)成 Promise 對象,并立即resolve。

await命令后面的 Promise 對象如果變?yōu)閞eject狀態(tài),則reject的參數(shù)會被catch方法的回調(diào)函數(shù)接收到。

async function f() {
  await Promise.reject("出錯了");
}

f()
.then(v => console.log(v))
.catch(e => console.log(e))
// 出錯了

只要一個await語句后面的 Promise 變?yōu)閞eject,那么整個async函數(shù)都會中斷執(zhí)行。

以上都是學(xué)習(xí)過程的筆記。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/89078.html

相關(guān)文章

  • JavaScript基礎(chǔ)——深入學(xué)習(xí)async/await

    摘要:等待的基本語法該關(guān)鍵字的的意思就是讓編譯器等待并返回結(jié)果。這里并不會占用資源,因為引擎可以同時執(zhí)行其他任務(wù)其他腳本或處理事件。接下來,我們寫一個火箭發(fā)射場景的小例子不是真的發(fā)射火箭 本文由云+社區(qū)發(fā)表 本篇文章,小編將和大家一起學(xué)習(xí)異步編程的未來——async/await,它會打破你對上篇文章Promise的認(rèn)知,竟然異步代碼還能這么寫! 但是別太得意,你需要深入理解Promise后,...

    張金寶 評論0 收藏0
  • ES6-7

    摘要:的翻譯文檔由的維護(hù)很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評論0 收藏0
  • 學(xué)習(xí)JavaScript循環(huán)下async/await

    摘要:原因是的循環(huán)方法等是并行迭代,可以理解為的效果是無效的解決方案使用最原始的循環(huán)將上述的模擬異步任務(wù)修改為或參考連接用來處理異步在不起作用解決異步循環(huán)的使用方法 問題描述 在進(jìn)行業(yè)務(wù)開發(fā)的過程中,使用了數(shù)組的高級函數(shù)map,同時使用了ES6語法async/await,發(fā)現(xiàn)在map循環(huán)下任務(wù)是異步執(zhí)行的,并不符合預(yù)期 例子說明 /** * 異步打印數(shù)據(jù) */ const echo =...

    Ilikewhite 評論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記(十七)--Promise里代碼為什么比setTimeout先執(zhí)行?

    摘要:版本以及之前,本身還沒有異步執(zhí)行代碼的能力,宿主環(huán)境傳遞給引擎,然后按順序執(zhí)行,由宿主發(fā)起任務(wù)。采納引擎術(shù)語,把宿主發(fā)起的任務(wù)稱為宏觀任務(wù),把引擎發(fā)起的任務(wù)稱為微觀任務(wù)?;居梅ㄊ纠幕卣{(diào)是一個異步的執(zhí)行過程。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完整的...

    pinecone 評論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記(十七)--Promise里代碼為什么比setTimeout先執(zhí)行?

    摘要:版本以及之前,本身還沒有異步執(zhí)行代碼的能力,宿主環(huán)境傳遞給引擎,然后按順序執(zhí)行,由宿主發(fā)起任務(wù)。采納引擎術(shù)語,把宿主發(fā)起的任務(wù)稱為宏觀任務(wù),把引擎發(fā)起的任務(wù)稱為微觀任務(wù)?;居梅ㄊ纠幕卣{(diào)是一個異步的執(zhí)行過程。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完整的...

    zorpan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<