摘要:函數(shù)內(nèi)部語(yǔ)句返回的值,會(huì)成為方法回調(diào)函數(shù)的參數(shù)。也就是說(shuō),只有函數(shù)內(nèi)部的異步操作執(zhí)行完,才會(huì)執(zhí)行方法指定的回調(diào)函數(shù)。命令后面的對(duì)象如果變?yōu)闋顟B(tài),則的參數(shù)會(huì)被方法的回調(diào)函數(shù)接收到。
async 函數(shù)
ES2017 標(biāo)準(zhǔn)引入了 async 函數(shù),使得異步操作變得更加方便,就是 Generator 函數(shù)的語(yǔ)法糖。
對(duì)比一下:
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ù)的星號(hào)(*)替換成async,將yield替換成await,僅此而已。
async的優(yōu)點(diǎn)async的書寫方式,比之前的promise、genenator方式都好,以下四點(diǎn)優(yōu)勢(shì):
內(nèi)置執(zhí)行器。
async函數(shù)的執(zhí)行,與普通函數(shù)一模一樣,只要一行。function(),這樣就可以執(zhí)行,不像 Generator 函數(shù),需要調(diào)用next方法,或者用co模塊,才能真正執(zhí)行,得到最后結(jié)果。
更好的語(yǔ)義
async和await,比起星號(hào)和yield,語(yǔ)義更清楚了。async表示函數(shù)里有異步操作,await表示緊跟在后面的表達(dá)式需要等待結(jié)果。
更廣的適用性
yield命令后面只能是 Thunk 函數(shù)或 Promise 對(duì)象,而async函數(shù)的await命令后面,可以是Promise 對(duì)象和原始類型的值(數(shù)值、字符串和布爾值,但這時(shí)等同于同步操作)。
返回值是 Promise
async函數(shù)的返回值是 Promise 對(duì)象,這比 Generator 函數(shù)的返回值是 Iterator 對(duì)象方便多了。你可以用then方法指定下一步的操作。
進(jìn)一步說(shuō),async函數(shù)完全可以看作多個(gè)異步操作,包裝成的一個(gè) Promise 對(duì)象,而await命令就是內(nèi)部then命令的語(yǔ)法糖。
返回值async函數(shù)返回一個(gè) Promise 對(duì)象。async函數(shù)內(nèi)部return語(yǔ)句返回的值,會(huì)成為then方法回調(diào)函數(shù)的參數(shù)。
async function f() { return "hello world"; } f().then(v => console.log(v)) // "hello world"
上面代碼中,函數(shù)f內(nèi)部return命令返回的值,會(huì)被then方法回調(diào)函數(shù)接收到。async函數(shù)內(nèi)部拋出錯(cuò)誤,會(huì)導(dǎo)致返回的 Promise 對(duì)象變?yōu)閞eject狀態(tài)。拋出的錯(cuò)誤對(duì)象會(huì)被catch方法回調(diào)函數(shù)接收到。
async函數(shù)返回的 Promise 對(duì)象,必須等到內(nèi)部所有await命令后面的 Promise 對(duì)象執(zhí)行完,才會(huì)發(fā)生狀態(tài)改變,除非遇到return語(yǔ)句或者拋出錯(cuò)誤。也就是說(shuō),只有async函數(shù)內(nèi)部的異步操作執(zhí)行完,才會(huì)執(zhí)行then方法指定的回調(diào)函數(shù)。
await正常情況下,await命令后面是一個(gè) Promise 對(duì)象。如果不是,會(huì)被轉(zhuǎn)成一個(gè)立即resolve的 Promise 對(duì)象。上面代碼中,await命令的參數(shù)是數(shù)值123,它被轉(zhuǎn)成 Promise 對(duì)象,并立即resolve。
await命令后面的 Promise 對(duì)象如果變?yōu)閞eject狀態(tài),則reject的參數(shù)會(huì)被catch方法的回調(diào)函數(shù)接收到。
async function f() { await Promise.reject("出錯(cuò)了"); } f() .then(v => console.log(v)) .catch(e => console.log(e)) // 出錯(cuò)了
只要一個(gè)await語(yǔ)句后面的 Promise 變?yōu)閞eject,那么整個(gè)async函數(shù)都會(huì)中斷執(zhí)行。
以上都是學(xué)習(xí)過程的筆記。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89078.html
摘要:等待的基本語(yǔ)法該關(guān)鍵字的的意思就是讓編譯器等待并返回結(jié)果。這里并不會(huì)占用資源,因?yàn)橐婵梢酝瑫r(shí)執(zhí)行其他任務(wù)其他腳本或處理事件。接下來(lái),我們寫一個(gè)火箭發(fā)射場(chǎng)景的小例子不是真的發(fā)射火箭 本文由云+社區(qū)發(fā)表 本篇文章,小編將和大家一起學(xué)習(xí)異步編程的未來(lái)——async/await,它會(huì)打破你對(duì)上篇文章Promise的認(rèn)知,竟然異步代碼還能這么寫! 但是別太得意,你需要深入理解Promise后,...
摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:原因是的循環(huán)方法等是并行迭代,可以理解為的效果是無(wú)效的解決方案使用最原始的循環(huán)將上述的模擬異步任務(wù)修改為或參考連接用來(lái)處理異步在不起作用解決異步循環(huán)的使用方法 問題描述 在進(jìn)行業(yè)務(wù)開發(fā)的過程中,使用了數(shù)組的高級(jí)函數(shù)map,同時(shí)使用了ES6語(yǔ)法async/await,發(fā)現(xiàn)在map循環(huán)下任務(wù)是異步執(zhí)行的,并不符合預(yù)期 例子說(shuō)明 /** * 異步打印數(shù)據(jù) */ const echo =...
摘要:版本以及之前,本身還沒有異步執(zhí)行代碼的能力,宿主環(huán)境傳遞給引擎,然后按順序執(zhí)行,由宿主發(fā)起任務(wù)。采納引擎術(shù)語(yǔ),把宿主發(fā)起的任務(wù)稱為宏觀任務(wù),把引擎發(fā)起的任務(wù)稱為微觀任務(wù)?;居梅ㄊ纠幕卣{(diào)是一個(gè)異步的執(zhí)行過程。 筆記說(shuō)明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完整的...
摘要:版本以及之前,本身還沒有異步執(zhí)行代碼的能力,宿主環(huán)境傳遞給引擎,然后按順序執(zhí)行,由宿主發(fā)起任務(wù)。采納引擎術(shù)語(yǔ),把宿主發(fā)起的任務(wù)稱為宏觀任務(wù),把引擎發(fā)起的任務(wù)稱為微觀任務(wù)。基本用法示例的回調(diào)是一個(gè)異步的執(zhí)行過程。 筆記說(shuō)明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完整的...
閱讀 3024·2021-10-27 14:15
閱讀 3017·2021-09-07 10:18
閱讀 1335·2019-08-30 15:53
閱讀 1585·2019-08-26 18:18
閱讀 3387·2019-08-26 12:15
閱讀 3470·2019-08-26 10:43
閱讀 665·2019-08-23 16:43
閱讀 2220·2019-08-23 15:27