92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

async function

2021-9-24    前端達人

這篇文章多看幾遍加深理解

async function 聲明定義了一個異步函數,它返回一個AsyncFunction對象。異步函數 是指通過 事件循環(event loop) 異步執行的函數,通過返回一個隱式的 Promise 作為其結果。使用異步函數的代碼的語法和結構更像使用標準同步功能。(The async function declaration defines an asynchronous function, which returns an AsyncFunction object. An asynchronous function is a function which operates asynchronously via the event loop, using an implicit Promise to return its result. But the syntax and structure of your code using async functions is much more like using standard synchronous functions.

語法

async function name([param[, param[, ... param]]]) { statements } 
  • 1

參數

  • name:函數名稱
  • param:要傳遞給函數的參數。
  • statements:函數體語句。

返回值:返回一個promise對象,將返回異步函數返回的值(如果異步函數是resolved則返回resolved的值;如果拋出異常,則rejected從異步函數中拋出的異常)。(A Promise which will be resolved with the value returned by the async function, or rejected with an uncaught exception thrown from within the async function.)

異步函數可以包含await表達式,該表達式暫停異步函數的執行 并等待 Promise的執行結果返回,結果返回后就恢復異步函數的執行。

await 關鍵字只在異步函數(async functions)內有效。如果在異步函數外使用它,會拋出語法錯誤。
當異步函數暫停時,它調用的函數仍會繼續執行。

舉例一:

function resolveAfter5Seconds() { return new Promise(resolve => { setTimeout(() => { resolve('resolved'); }, 5000); }); } async function asyncCall() { console.log('calling'); let result = await resolveAfter5Seconds(); console.log(result); // 5s之后輸出結果 } asyncCall(); //返回的是一個promise對象 // console.log(asyncCall()); // Promise { <pending> } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

運行效果:
在這里插入圖片描述
舉例二:

let resolveAfter6Second = function () { console.log('start slow promise'); return new Promise(resolve => { setTimeout(() => { resolve('slow'); console.log('slow promise is done'); }, 6000); }) } let resolveAfter4Second = function () { console.log('start fast promise'); return new Promise(resolve => { setTimeout(() => { resolve('fast'); console.log('fast promise is done'); }, 4000); }) } let sequentialStart = async function () { console.log('sequential start'); const slow = await resolveAfter6Second(); console.log(slow); const fast = await resolveAfter4Second(); console.log(fast); } sequentialStart() //立即輸出 // sequential start // start slow promise //再過6秒后輸出 // slow promise is done // slow // start fast promise //再過4秒后輸出 // fast promise is done // fast 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

運行效果:
在這里插入圖片描述
換一種await的寫法,結果完全不同:兩個計時器被同時創建

let resolveAfter6Seconds = function () { console.log('start slow promise'); return new Promise(resolve => { setTimeout(() => { resolve('slow'); console.log('slow promise is done'); }, 6000); }) } let resolveAfter4Seconds = function () { console.log('start fast promise'); return new Promise(resolve => { setTimeout(() => { resolve('fast'); console.log('fast promise is done'); }, 4000); }) } let concurrentStart = async function () { console.log('concurrent start'); let slow = resolveAfter6Seconds(); let fast = resolveAfter4Seconds(); console.log(await slow); console.log(await fast); } setTimeout(() => { concurrentStart(); }, 2000); //2秒后執行 // concurrent start // start slow promise // start fast promise //再過4秒后執行 // fast promise is done //再過2秒后執行 // slow promise is done // slow // fast 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

運行效果:
在這里插入圖片描述
在 concurrentStart 中,兩個計時器被同時創建,接著執行await。等待的是 promise的resolve回調,resolve后面的代碼( console.log(‘fast promise is done’);)會繼續執行。
這兩個計時器同時運行。但是 await 仍舊是順序執行的,第二個 await 還是得等待第一個執行完。在這個例子中,這使得先運行結束的輸出出現在最慢的輸出之后。
也可以把 concurrentStart 改寫成如下,運行效果一樣:

let resolveAfter6Seconds = function () { console.log('start slow promise'); return new Promise(resolve => { setTimeout(() => { resolve('slow'); console.log('slow promise is done'); }, 6000); }) } let resolveAfter4Seconds = function () { console.log('start fast promise'); return new Promise(resolve => { setTimeout(() => { resolve('fast'); console.log('fast promise is done'); }, 4000); }) } let concurrentPromise = async function () { console.log('concurrent start'); return Promise.all([resolveAfter6Seconds(), resolveAfter4Seconds()]).then((messages) => { console.log(messages[0]); // slow console.log(messages[1]); // fast }); } setTimeout(() => { concurrentPromise(); }, 2000); //2秒后輸出 // concurrent start // start slow promise // start fast promise //再過6秒后輸出 // fast promise is done //再過2秒后輸出 // slow promise is done // slow // fast 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

并行執行兩個或更多的任務,如下例所示:

let resolveAfter6Seconds = function () { console.log('start slow promise'); return new Promise(resolve => { setTimeout(() => { resolve('slow'); console.log('slow promise is done'); }, 6000); }) } let resolveAfter4Seconds = function () { console.log('start fast promise'); return new Promise(resolve => { setTimeout(() => { resolve('fast'); console.log('fast promise is done'); }, 4000); }) } let parallel = async function () { console.log('start paralel'); await Promise.all([ (async () => console.log(await resolveAfter6Seconds()))(), (async () => console.log(await resolveAfter4Seconds()))() ]); } setTimeout(parallel, 2000); //2秒后輸出 // start paralel // start slow promise // start fast promise //再過4秒后輸出 // fast promise is done // fast //再過2秒后輸出 // slow promise is done // slow 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

運行效果:
在這里插入圖片描述
如果希望并行執行兩個或更多的任務,你必須像在parallel中一樣使用await Promise.all([job1(), job2()])

也可以把parallel改寫成如下,運行效果一樣:

let resolveAfter6Seconds = function(){ console.log('start slow promise'); return new Promise(resolve => { setTimeout(() => { resolve('slow'); console.log('slow promise is done'); }, 6000); }); } let resolveAfter4Seconds = function(){ console.log('start fast promise'); return new Promise(resolve =>{ setTimeout(() => { resolve('fast'); console.log('fast promise is done'); }, 4000); }) } let parallelPromise = function(){ console.log('parallelPromise start'); resolveAfter6Seconds().then(msg => console.log(msg)); resolveAfter4Seconds().then(msg => console.log(msg)); } setTimeout(() => { parallelPromise(); }, 2000); //2秒后輸出 // parallelPromise start // start slow promise // start fast promise //再過4秒后輸出 // fast promise is done // fast //再過2秒后輸出 // slow promise is done // slow 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

async/await和Promise#then對比以及錯誤處理:
大多數異步函數(async functions )也可以使用 Promises函數 編寫。然而,當涉及到錯誤處理時,異步函數不太容易出錯。
上面例子中的concurrentStart函數和concurrentPromise函數在功能上都是等效的。在concurrentStart函數中,如果任一awaited調用失敗,它將自動捕獲異常,異步函數執行中斷,并通過隱式返回Promise將錯誤傳遞給調用者。
在Promise例子中這種情況同樣會發生,函數必須負責返回一個捕獲函數完成的Promise。在concurrentPromise函數中,這意味著它從Promise.all([]).then()中返回一個Promise。事實上,在此示例的先前版本忘記了這樣做!
但是,async函數仍有可能然可能錯誤地忽略錯誤。
以parallel異步函數為例。 如果它沒有等待await(或 return)Promise.all([])調用的結果,則不會傳播任何錯誤。
雖然parallelPromise函數示例看起來很簡單,但它根本不會處理錯誤! 這樣做需要一個類似于return Promise.all([])處理方式。(詳見

使用async函數重寫 promise 鏈

返回 Promise的 API 將會產生一個 promise 鏈,它將函數分解成許多部分。例如下面的代碼:

function getProcessedData(url) { return downloadData(url)// returns a promise .catch(e => { return downloadFallbackData(url);// returns a promise }) .then(v => { return processDataInWorker(v);// returns a promise }) } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

可以重寫為單個async函數:

async function getProcessedData(url) { let v; try { v = await downloadData(url); } catch (e) { v = await downloadFallbackData(); } return processDataInWorker(v); } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在上述示例中,return 語句中沒有 await 操作符,因為 async function 的返回值將被隱式地傳遞給 Promise.resolve。

return await promiseValue; 與 return promiseValue;的比較

返回值隱式的傳遞給Promise.resolve,并不意味著return await promiseValue;,只是在功能上等同于返回return promiseValue;。
重寫的上面代碼,在processDataInWorker拋出異常時返回null:

async function getProcessedData(url) { let v; try { v = await downloadData(url); } catch(e) { v = await downloadFallbackData(url); } try { return await processDataInWorker(v); // 注意 `return await` 和單獨 `return` 的比較 } catch (e) { return null; } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

簡單地寫上return processDataInworker(v);將導致在processDataInWorker(v)出錯時function返回值為Promise而不是返回null。

return foo;return await foo;有一些細微的差異:
return foo;不管foo是promise還是rejects都將會直接返回foo。相反地,如果foo是一個Promise,return await foo;將等待foo執行(resolve)或拒絕(reject),如果是拒絕,將會在返回前拋出異常。


















藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

分享此文一切功德,皆悉回向給文章原作者及眾讀者.

轉自:csdn
免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
成人精品电影在线| 国产精品久久网站| 国产va免费精品高清在线| 久久久久久久久久久久久9999| 亚洲成人自拍网| 成人免费视频国产在线观看| 色屁屁www国产馆在线观看| 国产黄色精品网站| 97国产真实伦对白精彩视频8| 国产在线一区二区三区欧美| 国产亚洲精久久久久久| 99re视频这里只有精品| 成人免费激情视频| 久久夜色精品国产亚洲aⅴ| 亚洲欧美日韩一区二区在线| 亚洲男人天堂九九视频| 国产精品久久久久久久久男| 国产精品久久久久久久午夜| 欧美日韩福利| 91女主播在线观看| 91蜜桃网址入口| 日本vs亚洲vs韩国一区三区二区| 久久精品国产久精国产一老狼| 亚洲天堂精品视频| 日本不卡二区| 亚洲黄色在线看| 精品亚洲国产视频| 欧美国产极品| 亚洲国产黄色片| 欧美成a人片免费观看久久五月天| 成人系列视频| 国产一区二区在线电影| 亚洲va韩国va欧美va精品| 亚洲亚洲一区二区三区| 久久国产精品一区二区| 日韩精品电影在线观看| 亚洲精品乱码久久久久久久久| 一本色道久久综合狠狠躁篇的优点| 午夜日本精品| 四季久久免费一区二区三区四区| a√中文在线观看| 国产精品丝袜高跟| 欧美理论片在线观看| 91玉足脚交白嫩脚丫在线播放| 激情文学综合丁香| 日日夜夜综合| 欧美aⅴ一区二区三区视频| 久久精品国产精品亚洲综合| 在线观看的日韩av| 日日夜夜天天综合入口| 日韩av在线播放中文字幕| 91在线国产电影| 欧美粗大gay| 欧美影院久久久| 国模视频一区| 97se在线视频| 久久人人88| 欧美性大战久久久久| 丝袜情趣国产精品| 99视频免费在线观看| 国产视频一区不卡| 日韩中文在线中文网在线观看| 亚洲级视频在线观看免费1级| 91精品视频网| 久久午夜影院| 久久精品视频播放| 日韩欧美在线网址| 欧美色欧美亚洲另类二区| 亚洲欧美日韩综合国产aⅴ| 亚洲成人不卡| 午夜宅男久久久| 亚洲美洲欧洲综合国产一区| 老司机在线精品视频| 国产精品yjizz| 国产精品久久久久久妇女| 国产成人av一区二区| 国产精品久久久久久久久久直播| 91中文字幕在线观看| 久久99在线观看| 老司机精品视频在线观看6| 国产精品久久久久久久电影| 精品国产区一区二区三区在线观看| 日本在线视频不卡| 久久九九国产精品怡红院| 五月天丁香综合久久国产| 欧美日韩中文在线| 亚洲成年人网站在线观看| 6080国产精品一区二区| 日韩国产一二三区| 久久亚洲欧美日韩精品专区| 国产精品mp4| 国产婷婷精品| 亚洲欧洲美洲av| 奇米影视一区二区三区小说| 国产在线精品一区在线观看麻豆| 欧美视频一二三区| 欧美一区二区三区| 国产精品成人午夜| 99国产精品私拍| 日韩黄色在线观看| 国产免费一区二区三区在线观看| 亚洲精品自拍视频| 无遮挡的视频在线观看| 国产精品视频久久久| 麻豆免费在线观看| 欧美日韩综合视频| 欧美精品欧美精品| 精品国产乱码久久久久久老虎| 欧美精品久久久久久| 欧美午夜一区| 91精品视频播放| 精品国产91亚洲一区二区三区婷婷| 国产乱码精品一区二三赶尸艳谈| 国产传媒一区二区| 日韩欧美手机在线| 在线视频cao| 日本精品在线播放| 欧美激情啊啊啊| 成人午夜影院在线观看| 日韩视频不卡中文| 黄色成年人视频在线观看| 精品成人一区二区| 色88888久久久久久影院| 国语产色综合| 91久久久久久国产精品| 亚洲男人天堂九九视频| 一区二区三区不卡视频| 欧美草草影院在线视频| 91玉足脚交白嫩脚丫在线播放| 国产精品久久久久9999吃药| 欧美乱大交xxxxx| 欧美日韩国产一区在线| 精品国产不卡一区二区| 成人免费观看在线观看| 成人av综合在线| 日韩欧美网站| 都市激情亚洲色图| 欧美**vk| 在线播放精品| 欧美狂野另类xxxxoooo| 欧美激情亚洲国产| 亚洲精美色品网站| 色爱精品视频一区| 国产91亚洲精品久久久| 先锋影音一区二区三区| 99久久久国产精品免费调教网站| 成人网在线视频| 亚洲精品在线看| 欧美亚洲一区二区在线| 亚洲区一区二区| aa级大片免费在线观看| 中文字幕在线不卡视频| 久久99精品一区二区三区三区| 日韩中文字幕不卡视频| 91精品久久久久久久久久久| 自拍亚洲一区| 美女日韩一区| 日韩欧美一区免费| 韩日精品一区二区| 久久精品magnetxturnbtih| 三级一区在线视频先锋| 久久精品久久久久| 在线播放一区二区三区| 性欧美xxx69hd高清|