JS中的async與await怎么使用
一、async
async
創(chuàng)建一個(gè)異步函數(shù)來(lái)定義一個(gè)代碼塊,在其中運(yùn)行異步代碼;
怎樣變成異步函數(shù)呢?以 async
這個(gè)關(guān)鍵字開(kāi)始,它可以被放置在一個(gè)函數(shù)前面
async function f() { return 1; } f().then(alert); // 1 //上下結(jié)果一樣 async function f() { return Promise.resolve(1); } f().then(alert); // 1 //也可以用箭頭函數(shù) let hello = async () => { return "1" }; hello().then((value) => console.log(value)) //返回值也可以簡(jiǎn)化成這樣 hello().then(console.log)
異步函數(shù)的特征之一:保證函數(shù)的返回值為 promise
。
將 async
關(guān)鍵字加到函數(shù)申明中,可以告訴它們返回的是 promise
,而不是直接返回值。此外,它避免了同步函數(shù)為支持使用 await
帶來(lái)的任何潛在開(kāi)銷。
二、await:
await
只在異步函數(shù)里面才起作用。它可以放在任何異步的,關(guān)鍵字 await
讓 JavaScript
引擎等待直到 promise
完成并返回結(jié)果。在等待promise
的同時(shí),其他正在等待執(zhí)行的代碼就有機(jī)會(huì)執(zhí)行了。
您可以在調(diào)用任何返回Promise
的函數(shù)時(shí)使用 await
,包括Web API
函數(shù)。
async function f() { let promise = new Promise((resolve, reject) => { setTimeout(() => resolve("咚!"), 1000) }); let result = await promise; // 等待執(zhí)行,直到 promise resolve 執(zhí)行完 alert(result); // "咚!" } f();//拿到 result 作為結(jié)果繼續(xù)往下執(zhí)行。所以上面這段代碼在1秒后顯示 “咚!”。
注意:await 實(shí)際上會(huì)暫停函數(shù)的執(zhí)行,直到 promise 狀態(tài)變?yōu)?完成,然后以 promise 的結(jié)果繼續(xù)執(zhí)行。這個(gè)行為不會(huì)耗費(fèi)任何 CPU 資源,因?yàn)?JavaScript 引擎可以同時(shí)處理其他任務(wù):執(zhí)行其他腳本,處理事件等。
三、綜合應(yīng)用
有了async/await
就去除了到處都是 .then()
代碼塊,因?yàn)?code>await會(huì)等待了。
async function A() { let response = await fetch('c.jpg'); let myBlob = await response.blob(); let objectURL = URL.createObjectURL(myBlob); let image = document.createElement('img'); image.src = objectURL; document.body.appendChild(image); } A() .catch(e => { console.log('問(wèn)題: ' + e.message); });
用更少的.then()
塊來(lái)封裝代碼,同時(shí)它看起來(lái)很像同步代碼,所以它非常直觀。這樣用的很爽!
到此這篇關(guān)于JS的async/await
怎么使用的文章就介紹到這了,更多相關(guān)JS的async/await 用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ES6學(xué)習(xí)筆記之let、箭頭函數(shù)和剩余參數(shù)
ES6為我們?cè)诤瘮?shù)的使用上也提供了許多的便捷的東西,下面這篇文章主要給大家介紹了關(guān)于ES6學(xué)習(xí)筆記之let、箭頭函數(shù)和剩余參數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09js實(shí)現(xiàn)導(dǎo)航欄中英文切換效果
本篇文章主要分享了javascript實(shí)現(xiàn)導(dǎo)航欄中英文切換效果的示例代碼,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01elementui的select實(shí)現(xiàn)多選添加功能
這篇文章主要介紹了elementui的select實(shí)現(xiàn)多選添加功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03html+javascript+bootstrap實(shí)現(xiàn)層級(jí)多選框全層全選和多選功能
想做一個(gè)先按層級(jí)排序并可以多選的功能,首先傾向于用多層標(biāo)簽式的,直接選定加在文本域里,接下來(lái)通過(guò)本文給大家介紹html+javascript+bootstrap實(shí)現(xiàn)層級(jí)多選框全層全選和多選功能,需要的朋友參考下2017-03-03微信小程序使用scroll-view標(biāo)簽實(shí)現(xiàn)自動(dòng)滑動(dòng)到底部功能的實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了微信小程序使用scroll-view標(biāo)簽實(shí)現(xiàn)自動(dòng)滑動(dòng)到底部功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-11-11webpack實(shí)現(xiàn)一個(gè)行內(nèi)樣式px轉(zhuǎn)vw的loader示例
這篇文章主要介紹了webpack實(shí)現(xiàn)一個(gè)行內(nèi)樣式px轉(zhuǎn)vw的loader示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09ExpressJS使用express-ws的實(shí)例詳解
這篇文章主要介紹了ExpressJS使用express-ws的實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09JavaScript 九種跨域方式實(shí)現(xiàn)原理
這篇文章主要介紹了JavaScript 九種跨域方式實(shí)現(xiàn)原理,什么是跨域,以及有哪幾種跨域方式,這是本文要探討的內(nèi)容。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02js執(zhí)行字符串代碼的具體實(shí)現(xiàn)
這篇文章主要給大家介紹了js執(zhí)行字符串代碼的具體實(shí)現(xiàn),需要的朋友可以參考下2024-06-06