最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

es7中的async、await使用方法示例詳解

 更新時間:2023年01月27日 10:07:00   投稿:yin  
async、await是es7里面的新語法,async申明一個function是異步,而await等待一個異步方法執(zhí)行完成。替代promise中的then。async函數(shù)返回一個Promise對象,當函數(shù)執(zhí)行的時候,一旦遇到await就會先返回,等到觸發(fā)的異步操作完成,再接著執(zhí)行函數(shù)體內后面的語句。

async、await 是es7里面的新語法,它的作用就是 async 用于申明一個 function 是異步的,而 await 用于等待一個異步方法執(zhí)行完成。它可以很好的替代promise 中的then。async 函數(shù)返回一個 Promise 對象,可以使用then 方法添加回調函數(shù)。當函數(shù)執(zhí)行的時候,一旦遇到await 就會先返回,等到異步操作完成,再接著執(zhí)行函數(shù)體內后面的語句。

一、前言

回調是JavaScript在es5之前處理異步方法的常用方式,當異步調用又調用了異步方法時,前端的小伙伴們應該都遇到過這種場景吧,回調方式的寫法讓人看得頭皮發(fā)麻,代碼的可讀性非常差

ES2015中引入Promise, 目的就是為了解決著名的回調地獄,但是它自己引入了語法復雜性。示例如下:

function takeLongTime() {
    return new Promise(resolve => {
        setTimeout(() => resolve("long_time_value"), 1000);
    });
}
 
takeLongTime().then(v => {
    console.log("got", v);
});

ES2017增加了異步函數(shù)async/await,提高了代碼可讀性,讓調用異步方法像同步一樣簡單。示例如下:

function takeLongTime() {
    return new Promise(resolve => {
        setTimeout(() => resolve("long_time_value"), 1000);
    });
}
 
async function test() {
    const v = await takeLongTime();
    console.log(v);
}
 
test();

async/await使代碼看起來像是同步的,但它在后臺是異步和非阻塞的。可以理解 await 后面的語句相當于放到了 new Promise 中,下一行及之后的語句相當于放在 Promise.then 中。 async 會將其后的函數(shù)(函數(shù)表達式或 Lambda)的返回值封裝成一個 Promise 對象,而 await 會等待這個 Promise 完成,并將其 resolve 的結果返回出來。

二、async 和 await 的基礎使用

async/awiat 的使用規(guī)則:

    async 返回的是一個 Promise 成功的對象,await 就是等待這個 promise 的返回結果后,再繼續(xù)執(zhí)行
    await 等待的是一個 Promise 對象,后面必須跟一個 Promise 對象,但是不必寫 then (),直接就可以得到返回值

但注意,await 所等待的 promise 對象,他的最終狀態(tài)一定是 resolve 的(當然也可以不是 resolve ,只不過不會執(zhí)行后面的代碼罷了),否則不會執(zhí)行await 后面的代碼,也就是不會去執(zhí)行所謂的 then() ;

三、async \ await使用場景

//將請求改造成一個通用函數(shù)
function request(options) {
    //.....
    return new Promise(....); //使用Promise執(zhí)行請求,并返回Promise對象
}
//于是我們就可以來發(fā)送請求了
request("ajaxA")
.then((data)=>{
   //處理data
   return request("ajaxB")
})
.then((data)=>{
   //處理data
   return request("ajaxC")
})
.then((data)=>{
   //處理data
   return request("ajaxD")
})

如果能像使用同步代碼那樣, 使用Promise就好了。于是, async \ await出現(xiàn)了

function request(options) {
    //.....
    return new Promise(....); //使用Promise執(zhí)行請求,并返回Promise對象
}
//wait這個單詞是等待的意思
async function load(){
    await request("ajaxA");  //那么這里就是在等待ajaxA請求的完成
    await request("ajaxB");
    await request("ajaxC");
    await request("ajaxD");
}

await關鍵字使用的要求非常簡單, 后面調用的函數(shù)要返回一個Promise對象。load()這個函數(shù)已經(jīng)不再是普通函數(shù), 它出現(xiàn)了await這樣"阻塞式"的操作 因此async關鍵字在這是不能省略的。與之前長長的then鏈和then方法里的回調函數(shù)相比,這樣的寫法看起來像是同步寫法并且更加清爽,更加符合編程習慣。

四、await返回打印測試

await后面的promise狀態(tài)不是resolve的輸出結果

async function async1 () {
  console.log('async1 start');
  await new Promise(resolve => {
    console.log('promise1');
  })
  console.log('async1 success');
  return 'async1 end'
}
console.log('srcipt start')
async1().then(res => console.log(res))
console.log('srcipt end')

/* await后面的promise狀態(tài)不是resolve的輸出結果
"srcipt start"
"async1 start"
"promise1"
"srcipt end"
*/

這里我們可以看到:在 async1 中 await 后面的 Promise 是沒有返回值的,也就是它的狀態(tài)始終是 pending 狀態(tài),所以在 await 之后的內容是不會執(zhí)行的,包括 async1 后面的 .then。

await后面的promise狀態(tài)是resolve的輸出結果

async function async1 () {
  console.log('async1 start');
  await new Promise(resolve => {
    console.log('promise1');
    resolve()
  })
  console.log('async1 success');
  return 'async1 end'
}
console.log('srcipt start')
async1().then(res => console.log(res))
console.log('srcipt end')

/*await后面的promise狀態(tài)是resolve的輸出結果
"srcipt start"
"async1 start"
"promise1"
"srcipt end"
"async1 success"
"async1 end"
*/

五、總結

解決函數(shù)回調經(jīng)歷了幾個階段, Promise 對象, Generator 函數(shù)到async函數(shù)。async函數(shù)目前是解決函數(shù)回調的最佳方案。很多語言目前都實現(xiàn)了async,包括Python ,java spring,go等。

async 函數(shù)返回一個 Promise 對象,當函數(shù)執(zhí)行的時候,一旦遇到 await 就會先返回,等到觸發(fā)的異步操作完成,再接著執(zhí)行函數(shù)體內后面的語句。

到此這篇關于es7中的async、await使用方法示例詳解的文章就介紹到這了,更多相關async、await使用示例內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 利用PHP實現(xiàn)遞歸刪除鏈表元素的方法示例

    利用PHP實現(xiàn)遞歸刪除鏈表元素的方法示例

    這篇文章主要給大家介紹了關于如何利用PHP實現(xiàn)遞歸刪除鏈表元素的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • 基于ES6 Array.of的用法(實例講解)

    基于ES6 Array.of的用法(實例講解)

    下面小編就為大家?guī)硪黄贓S6 Array.of的用法(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Echarts自定義地圖和添加圖標代碼示例

    Echarts自定義地圖和添加圖標代碼示例

    這篇文章主要給大家介紹了關于Echarts自定義地圖和添加圖標的相關資料,項目中經(jīng)常會遇到需要渲染echarts地圖的情況,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • 基于JavaScript實現(xiàn)瀑布流效果(循環(huán)漸近)

    基于JavaScript實現(xiàn)瀑布流效果(循環(huán)漸近)

    本文給大家介紹基于javascript實現(xiàn)循環(huán)漸近瀑布流效果,代碼簡單易懂,非常具有參考價值,需要的朋友參考下吧
    2016-01-01
  • ES6入門教程之變量的解構賦值詳解

    ES6入門教程之變量的解構賦值詳解

    這篇文章主要給大家介紹了關于ES6入門教程之變量的解構賦值的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用ES6具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • JavaScript前端面試扁平數(shù)據(jù)轉tree與tree數(shù)據(jù)扁平化

    JavaScript前端面試扁平數(shù)據(jù)轉tree與tree數(shù)據(jù)扁平化

    這篇文章主要為大家介紹了JavaScript面試中扁平數(shù)據(jù)轉tree以及tree數(shù)據(jù)扁平化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • javascript實現(xiàn)的鼠標鏈接提示效果生成器代碼

    javascript實現(xiàn)的鼠標鏈接提示效果生成器代碼

    javascript實現(xiàn)的鼠標鏈接提示效果生成器代碼...
    2007-06-06
  • JavaScript實現(xiàn)即時通訊的 4 種方案

    JavaScript實現(xiàn)即時通訊的 4 種方案

    這篇文章主要給大家分享了JavaScript實現(xiàn)即時通訊的 4 種方案,其實就是服務端如何將數(shù)據(jù)推送到瀏覽器,下面詳細的文章內容,需要的小伙伴參考一下,洗碗給對你有所幫助
    2022-02-02
  • JavaScript二叉搜索樹構建操作詳解

    JavaScript二叉搜索樹構建操作詳解

    這篇文章主要介紹了JavaScript二叉搜索樹構建操作詳解,文章圍繞主題展開二叉搜索樹的性質以及二叉搜索樹的構建、查找和刪除等內容,需要的小伙伴可以參考一下
    2022-07-07
  • JS寫XSS cookie stealer來竊取密碼的步驟詳解

    JS寫XSS cookie stealer來竊取密碼的步驟詳解

    JavaScript是web中最常用的腳本開發(fā)語言,js可以自動執(zhí)行站點組件,管理站點內容,在web業(yè)內實現(xiàn)其他有用的函數(shù)。這篇文章主要介紹了JS寫XSS cookie stealer來竊取密碼的步驟詳解,需要的朋友可以參考下
    2017-11-11

最新評論

仁布县| 宝应县| 海安县| 龙井市| 任丘市| 哈巴河县| 钟山县| 方山县| 阳朔县| 外汇| 民和| 剑河县| 铜鼓县| 定远县| 都安| 绥滨县| 教育| 西乌珠穆沁旗| 资溪县| 澄江县| 屏边| 高台县| 渭南市| 安多县| 五台县| 珲春市| 阳西县| 田阳县| 平南县| 阿克| 泸水县| 洛隆县| 平阴县| 桐城市| 怀集县| 宝丰县| 潮州市| 枣阳市| 崇仁县| 东兰县| 封开县|