摘要:當(dāng)函數(shù)執(zhí)行時(shí),遇到就會(huì)停止等待,直到異步操作完整之后,再繼續(xù)往下執(zhí)行。并且,函數(shù)內(nèi)部語(yǔ)句返回的值,會(huì)成為方法回調(diào)函數(shù)的參數(shù)。拋出的錯(cuò)誤對(duì)象會(huì)被方法回調(diào)函數(shù)接收到。命令后面的對(duì)象變?yōu)闋顟B(tài)只要一個(gè)語(yǔ)句后面的變?yōu)椋敲凑麄€(gè)函數(shù)都會(huì)中斷執(zhí)行。
async 函數(shù)是什么?
async函數(shù)是什么?一句話,它就是 Generator 函數(shù)的語(yǔ)法糖。
當(dāng)async函數(shù)執(zhí)行時(shí),遇到await就會(huì)停止等待,直到異步操作完整之后,再繼續(xù)往下執(zhí)行。
下面是一個(gè)例子,指定多少毫秒后函數(shù)返回一個(gè)值
async function asyncReturn(value, ms) { await new Promise(function(resolve, reject) { setTimeout(resolve, ms); }); return value; }
async函數(shù)返回一個(gè) Promise 對(duì)象,可以使用then方法添加回調(diào)函數(shù)。并且,async函數(shù)內(nèi)部return語(yǔ)句返回的值,會(huì)成為then方法回調(diào)函數(shù)的參數(shù)。
asyncReturn("Hello World", 3000).then(value => { console.log(value); });async 函數(shù)的錯(cuò)誤處理機(jī)制
async函數(shù)內(nèi)部拋出錯(cuò)誤,會(huì)導(dǎo)致返回的 Promise 對(duì)象變?yōu)閞eject狀態(tài)。拋出的錯(cuò)誤對(duì)象會(huì)被catch方法回調(diào)函數(shù)接收到。
async function fn1() { throw new Error("async 函數(shù)內(nèi)部拋出錯(cuò)誤了!"); } fn1().catch(err => { console.log(err); });
await命令后面的 Promise 對(duì)象如果變?yōu)閞eject狀態(tài),則reject的參數(shù)會(huì)被catch方法的回調(diào)函數(shù)接收到。
async function fn2() { await Promise.reject("await命令后面的 Promise 對(duì)象變?yōu)閞eject狀態(tài)"); } fn2().catch(err => { console.log(err); });
只要一個(gè)await語(yǔ)句后面的 Promise 變?yōu)閞eject,那么整個(gè)async函數(shù)都會(huì)中斷執(zhí)行。
async function fn3() { await Promise.reject("出錯(cuò)了"); await Promise.resolve("hello world"); // 不會(huì)執(zhí)行 } fn3().catch(err => { console.log(err); });
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91968.html
摘要:文章起因今天在學(xué)習(xí)一個(gè)的測(cè)試框架中,在閱讀文檔時(shí)看到用來(lái)判斷是否支持函數(shù)的代碼。 文章起因 今天在學(xué)習(xí)Jasmine(一個(gè)Javascript的測(cè)試框架)中,在閱讀文檔時(shí)看到用來(lái)判斷是否支持async函數(shù)的代碼。 // 獲取async函數(shù)的原型的構(gòu)造器 function getAsyncCtor() { try { eval(var func = async fun...
摘要:想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳博客一年百來(lái)篇優(yōu)質(zhì)文章等著你引入的在的異步編程中是一個(gè)極好的改進(jìn)。可能會(huì)產(chǎn)生誤導(dǎo)一些文章將與進(jìn)行了比較,并聲稱它是下一代異步編程風(fēng)格,對(duì)此作者深表異議。結(jié)論引入的關(guān)鍵字無(wú)疑是對(duì)異步編程的改進(jìn)。 showImg(https://segmentfault.com/img/bVbjFP0?w=800&h=450); 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇...
摘要:分鐘讀完以前我們使用。把異步變成了同步。允許同時(shí)執(zhí)行所有的異步函數(shù)函數(shù)總耗時(shí)為秒的耗時(shí)。的錯(cuò)誤處理在語(yǔ)法中,我們可以使用進(jìn)行錯(cuò)誤處理。在中的分支會(huì)進(jìn)入語(yǔ)句。閱讀原文討論地址分鐘學(xué)會(huì)的如果你想?yún)⑴c討論,請(qǐng)點(diǎn)擊這里 1 分鐘讀完 JavaScript Async/Await Explained in 10 Minutes showImg(https://segmentfault.com/i...
摘要:事件循環(huán)背景是一門單線程非阻塞的腳本語(yǔ)言,單線程意味著,代碼在執(zhí)行的任何時(shí)候,都只有一個(gè)主線程來(lái)處理所有的任務(wù)。在意識(shí)到該問(wèn)題之際,新特性中的可以讓成為一門多線程語(yǔ)言,但實(shí)際開(kāi)發(fā)中使用存在著諸多限制。這個(gè)地方被稱為執(zhí)行棧。 事件循環(huán)(Event Loop) 背景 JavaScript是一門單線程非阻塞的腳本語(yǔ)言,單線程意味著,JavaScript代碼在執(zhí)行的任何時(shí)候,都只有一個(gè)主線程來(lái)...
摘要:因?yàn)楹瘮?shù)返回一個(gè)對(duì)象,所以可以用于等待一個(gè)函數(shù)的返回值這也可以說(shuō)是在等函數(shù),但要清楚,它等的實(shí)際是一個(gè)返回值。幫我們干了啥作個(gè)簡(jiǎn)單的比較上面已經(jīng)說(shuō)明了會(huì)將其后的函數(shù)函數(shù)表達(dá)式或的返回值封裝成一個(gè)對(duì)象,而會(huì)等待這個(gè)完成,并將其的結(jié)果返回出來(lái)。 隨著 Node 7 的發(fā)布,越來(lái)越多的人開(kāi)始研究據(jù)說(shuō)是異步編程終級(jí)解決方案的 async/await。我第一次看到這組關(guān)鍵字并不是在 JavaSc...
摘要:控制臺(tái)將顯示回調(diào)地獄通常,回調(diào)只能由一個(gè)異步函數(shù)調(diào)用。更多資源使更友好規(guī)范使用異步函數(shù)簡(jiǎn)化異步編碼旅程異步編程是一項(xiàng)在中無(wú)法避免的挑戰(zhàn)。 JavaScript經(jīng)常聲稱是_異步_。那是什么意思?它如何影響發(fā)展?近年來(lái)這種方法有何變化? 請(qǐng)思考以下代碼: result1 = doSomething1(); result2 = doSomething2(result1); 大多數(shù)語(yǔ)言都處理每...
閱讀 1472·2021-11-24 09:39
閱讀 1788·2021-11-22 15:25
閱讀 3739·2021-11-19 09:40
閱讀 3299·2021-09-22 15:31
閱讀 1298·2021-07-29 13:49
閱讀 1208·2019-08-26 11:59
閱讀 1320·2019-08-26 11:39
閱讀 933·2019-08-26 11:00