摘要:異步函數(shù)是指通過事件循環(huán)異步執(zhí)行的函數(shù),它會(huì)通過一個(gè)隱式的返回其結(jié)果。如果函數(shù)中是一個(gè)值,這個(gè)值就是對(duì)象中的值如果函數(shù)中是一個(gè)值,這個(gè)值就是對(duì)象中的值??偨Y(jié)是在之后產(chǎn)生的,它和誕生的目的都是為了解決回調(diào)地獄,至于什么是回調(diào)地獄改進(jìn)后改進(jìn)后
async 函數(shù)
先看看MDN上怎么介紹的:
async function 聲明用于定義一個(gè)返回 AsyncFunction 對(duì)象的異步函數(shù)。異步函數(shù)是指通過事件循環(huán)異步執(zhí)行的函數(shù),它會(huì)通過一個(gè)隱式的 Promise 返回其結(jié)果。但是如果你的代碼使用了異步函數(shù),它的語法和結(jié)構(gòu)會(huì)更像是標(biāo)準(zhǔn)的同步函數(shù)。
如果async函數(shù)中是return一個(gè)值,這個(gè)值就是Promise對(duì)象中resolve的值;
如果async函數(shù)中是throw一個(gè)值,這個(gè)值就是Promise對(duì)象中reject的值。
async函數(shù)的寫法async function imAsync(num) { if (num > 0) { return num // 這里相當(dāng)于resolve(num) } else { throw num // 這里相當(dāng)于reject(num) } } imAsync(1).then(function (v) { console.log(v); // 1 }); // 注意這里是catch imAsync(0).catch(function (v) { console.log(v); // 0 })Promise的寫法
function imPromise(num) { return new Promise(function (resolve, reject) { if (num > 0) { resolve(num); } else { reject(num); } }) } imPromise(1).then(function (v) { console.log(v); // 1 }) imPromise(0).then(function (v) { console.log(v); // 0 })await
await會(huì)暫停當(dāng)前async函數(shù)的執(zhí)行,等待后面的Promise的計(jì)算結(jié)果返回以后再繼續(xù)執(zhí)行當(dāng)前的async函數(shù)。
如果單純的 await setTimeout(...)是行不通的,await 不是什么都等,它等待的只是Promise,你如果沒有給他返回個(gè)Promise,那它還是會(huì)繼續(xù)向下執(zhí)行。
所以 await 等待的不是所有的異步操作,等待的只是Promise。
async/await是在Promise之后產(chǎn)生的,它和Promise誕生的目的都是為了解決“回調(diào)地獄”,至于什么是回調(diào)地獄:
Promise改進(jìn)后:
async/await改進(jìn)后:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103930.html
摘要:?jiǎn)栴}的關(guān)鍵在于其執(zhí)行過程中的微任務(wù)數(shù)量,下文中我們需要用上述代碼中的方式對(duì)微任務(wù)的執(zhí)行順序進(jìn)行標(biāo)記,以輔助我們理解這其中的執(zhí)行過程。 原文發(fā)布在掘金社區(qū):https://juejin.im/post/5c3cc981f265da616a47e028 起源 2019年了,相信大家對(duì) Promise 和 async/await 都不再陌生了。 前幾日,我在社區(qū)讀到了一篇關(guān)于 async/...
摘要:解決辦法,將箭頭函數(shù)聲明為函數(shù),代碼如下運(yùn)行結(jié)果至此,問題解決。必須在函數(shù)的上下文中。對(duì)程序而言有了上下文調(diào)用幀才有一個(gè)完整的邏輯過程。 先簡(jiǎn)單介紹下async await: async/await是ES6推出的異步處理方案,目的也很明確:更好的實(shí)現(xiàn)異步編程。 詳細(xì)見阮大神 ES6入門 現(xiàn)在說說實(shí)踐中遇到的問題:使用await報(bào)錯(cuò)Unexpected identifier 先...
摘要:因?yàn)楹瘮?shù)返回一個(gè)對(duì)象,所以可以用于等待一個(gè)函數(shù)的返回值這也可以說是在等函數(shù),但要清楚,它等的實(shí)際是一個(gè)返回值。幫我們干了啥作個(gè)簡(jiǎn)單的比較上面已經(jīng)說明了會(huì)將其后的函數(shù)函數(shù)表達(dá)式或的返回值封裝成一個(gè)對(duì)象,而會(huì)等待這個(gè)完成,并將其的結(jié)果返回出來。 隨著 Node 7 的發(fā)布,越來越多的人開始研究據(jù)說是異步編程終級(jí)解決方案的 async/await。我第一次看到這組關(guān)鍵字并不是在 JavaSc...
摘要:所以是在一秒后顯示的。這個(gè)行為不會(huì)耗費(fèi)資源,因?yàn)橐婵梢酝瑫r(shí)處理其他任務(wù)執(zhí)行其他腳本,處理事件等。每個(gè)回調(diào)首先被放入微任務(wù)隊(duì)列然后在當(dāng)前代碼執(zhí)行完成后被執(zhí)行。,函數(shù)是異步的,但是會(huì)立即運(yùn)行。否則,就返回結(jié)果,并賦值。 「async/await」是 promises 的另一種更便捷更流行的寫法,同時(shí)它也更易于理解和使用。 Async functions 讓我們以 async 這個(gè)關(guān)鍵字開...
摘要:第部分畫圖一步步看清宏任務(wù)微任務(wù)的執(zhí)行過程我們以開篇的經(jīng)典面試題為例,分析這個(gè)例子中的宏任務(wù)和微任務(wù)。注意這里只是把推入微任務(wù)隊(duì)列,并沒有執(zhí)行。執(zhí)行結(jié)束,才能繼續(xù)執(zhí)行后面的代碼如圖此時(shí)當(dāng)前宏任務(wù)都執(zhí)行完了,要處理微任務(wù)隊(duì)列里的代碼。 8張圖讓你一步步看清 async/await 和 promise 的執(zhí)行順序 為什么寫這篇文章? 測(cè)試一下自己有沒有必要看 需要具備的前置基礎(chǔ)知識(shí) 主...
閱讀 2325·2021-09-28 09:45
閱讀 3606·2021-09-24 09:48
閱讀 2271·2021-09-22 15:49
閱讀 3109·2021-09-08 16:10
閱讀 1597·2019-08-30 15:54
閱讀 2332·2019-08-30 15:53
閱讀 3027·2019-08-29 18:42
閱讀 2877·2019-08-29 16:19