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

async/await讓異步操作同步執(zhí)行的方法詳解

 更新時間:2019年11月01日 08:33:53   作者:JH30K  
這篇文章主要給大家介紹了關(guān)于async/await讓異步操作同步執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者使用async/await具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

一.前言

我們經(jīng)常會遇到這樣的麻煩事,多個函數(shù)按順序執(zhí)行,返回結(jié)果卻不是我們預(yù)期的順序,原因一般是由于異步操作引起的,所以呢,我們需要一種解決方案來處理這種問題,從而使得異步操作按照同步的方式來執(zhí)行,這樣我們就可以控制異步操作輸出結(jié)果的順序了

二.異步操作會帶來什么問題

異步操作可能會許多的問題,下面是常見的兩種

1.函數(shù)執(zhí)行的結(jié)果并不是按照順序返回

function fn1(){
 console.log(111)
 setTimeout(function(){
  console.log('wait me 3000')
 },3000)
}
function fn2(){
 console.log(222)
}
fn1();
fn2();

//結(jié)果
//111
//222
//wait me 3000

上面的代碼,如果你期待的結(jié)果是

//111
//wait me 3000
//222

那就錯了,因為fn1函數(shù)里面還有一個函數(shù)setTimeout,這兩個函數(shù)是異步執(zhí)行的,而fn1和fn2是同步執(zhí)行的,先執(zhí)行fn1再執(zhí)行fn2,在執(zhí)行fn1的時候打印結(jié)果111,三秒后再執(zhí)行setTimeout,但是在這三秒之前已經(jīng)執(zhí)行完了fn2

那是不是由于setTimeout函數(shù)設(shè)置的等待時間太久了才會導(dǎo)致的呢?那下面我把時間設(shè)為0

function fn1(){
 console.log(111)
 setTimeout(function(){
  console.log('wait me 3000')
 },0)
}
function fn2(){
 console.log(222)
}
fn1();
fn2();
//結(jié)果
//111
//222
//wait me 3000

從結(jié)果上看并沒有改變,這是應(yīng)為setTimeout這個函數(shù)在執(zhí)行之前會查看執(zhí)行隊列看看有沒有人在排隊,如果有,那么將等其他的函數(shù)執(zhí)行完再執(zhí)行自己,所以不管就算你設(shè)置時間為0,也不會改變它最后一個執(zhí)行

2.在外部獲取不到異步函數(shù)里的值

下面我們看一個最簡單的例子,我的需求是要在fn1函數(shù)外面打印msg

function fn1(){
 setTimeout(function(){
  msg='wait me 3000';
 },3000);
}
fn1();

那么怎么樣才能獲取到msg呢

使用回調(diào)函數(shù)

function fn1(callback){
 setTimeout(function(){
  msg='wait me 3000';
  callback(msg);
 },3000);
}
fn1(data=>{
 console.log(data);//wait me 3000
});

使用Promise

function fn1(){
 return new Promise(function(res,rej){
  setTimeout(function(){
   msg='wait me 3000';
   res(msg);
  },3000);
 })
}
fn1().then(data=>{
 console.log(data)
})

三.async/await解決方案

async/await的作用就是使異步操作以同步的方式去執(zhí)行

異步操作同步化?

可以使用Promise中的then()來實現(xiàn),那么async/await與它之間有什么區(qū)別呢

1.async函數(shù)返回的是一個Promise對象

如果一個函數(shù)加了async關(guān)鍵詞,這個函數(shù)又有返回值,在調(diào)用這個函數(shù)時,如果函數(shù)執(zhí)行成功,內(nèi)部會調(diào)用Promise.solve()方法返回一個Promise對象,如果函數(shù)執(zhí)行出現(xiàn)異常,就會調(diào)用Promise.reject()方法返回一個promise 對象

要想獲取到async函數(shù)的執(zhí)行結(jié)果,就要調(diào)用Promise的then或catch來給它注冊回調(diào)函數(shù)

async function fn(){
 return '111'
}
console.log(fn());//Promise { '111' }

既然是Promise對象,因此可以使用then()獲取返回的結(jié)果

async function fn(){
 return '111'
}
fn().then(data=>{
 console.log(data)//111
})

2.await

上面介紹了async的作用,一般情況下,async與await配合使用才能使異步操作同步化,await就是等待的意思,等待某一個函數(shù)執(zhí)行完之后,后面的代碼才能開始執(zhí)行

function fn1(){
 return new Promise(resolve=>{
  setTimeout(function(){
   msg='wait me 3000';
   resolve(msg)
  },3000);
 });
}
async function asyncCall(){
 var result=await fn1();
 console.log(result); 
}
asyncCall();

如果我們沒有等待fn1執(zhí)行完之后再打印result,那么有可能得到是undefined

四.總結(jié)

在很多的時候,我們是希望按照同步的方式來獲得異步函數(shù)的結(jié)果,比如登錄時,我們必須要在后臺返回匹配成功的信息之后才能進行頁面跳轉(zhuǎn),因此,使異步操作同步化這是很重要的知識點,但是這種方案是基于Promise的基礎(chǔ)之上的,因此在學(xué)習(xí)該知識時,一定要對Promise有充分的理解

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 原生js實現(xiàn)新聞列表展開/收起全文功能

    原生js實現(xiàn)新聞列表展開/收起全文功能

    本文主要介紹了原生js實現(xiàn)新聞列表展開/收起全文功能的知識要點、注意事項以及完整代碼。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • Html中JS腳本執(zhí)行順序簡單舉例說明

    Html中JS腳本執(zhí)行順序簡單舉例說明

    寫在最前面的最先執(zhí)行,Body的onload事件要在頁面加載完后才執(zhí)行。
    2010-06-06
  • JS的拖拽屬性draggable詳解

    JS的拖拽屬性draggable詳解

    這篇文章主要介紹了JS的拖拽屬性draggable詳解,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • momentjs使用詳細說明

    momentjs使用詳細說明

    這篇文章主要介紹了momentjs詳細使用說明,使用 Moment.js 可以輕松地獲取上周、上月和前三個月的起始和結(jié)束時間,在示例中,我們傳入了 '2023-07-15',并將返回的日期信息存儲在 dateInfo 變量中,然后將其打印到控制臺上,需要的朋友可以參考下
    2023-07-07
  • 基于JS實現(xiàn)文字轉(zhuǎn)語音即文本朗讀

    基于JS實現(xiàn)文字轉(zhuǎn)語音即文本朗讀

    這篇文章主要為大家詳細介紹了JavaScript如何利用SpeechSynthesis實現(xiàn)文字轉(zhuǎn)語音即文本朗讀的功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Bootstrap基本插件學(xué)習(xí)筆記之Popover提示框(19)

    Bootstrap基本插件學(xué)習(xí)筆記之Popover提示框(19)

    這篇文章主要為大家詳細介紹了Bootstrap基本插件學(xué)習(xí)筆記之Popover提示框的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 如何使用Bootstrap 按鈕實例詳解

    如何使用Bootstrap 按鈕實例詳解

    本章將通過實例講解如何使用 Bootstrap 按鈕。任何帶有 class .btn 的元素都會繼承圓角灰色按鈕的默認(rèn)外觀。但是 Bootstrap 提供了一些選項來定義按鈕的樣式。具體通過本文實例詳解
    2017-03-03
  • JS圖片懶加載的優(yōu)點及實現(xiàn)原理

    JS圖片懶加載的優(yōu)點及實現(xiàn)原理

    這篇文章主要介紹了JS圖片懶加載的優(yōu)點及實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • js實現(xiàn)for循環(huán)跳過undefined值示例

    js實現(xiàn)for循環(huán)跳過undefined值示例

    這篇文章主要介紹了js實現(xiàn)for循環(huán)跳過undefined值,結(jié)合實例形式分析了js使用for循環(huán)針對數(shù)組的遍歷、判斷、運算等相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • js tab欄切換代碼實例解析

    js tab欄切換代碼實例解析

    這篇文章主要介紹了js tab欄切換代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09

最新評論

西华县| 蒙阴县| 佛山市| 三门县| 贡觉县| 玉龙| 青浦区| 安阳市| 合阳县| 竹北市| 天祝| 平利县| 房山区| 堆龙德庆县| 北京市| 连州市| 台北县| 正阳县| 精河县| 宜兴市| 苍梧县| 广灵县| 津市市| 同德县| 海丰县| 洛阳市| 呼和浩特市| 台州市| 稷山县| 衡南县| 调兵山市| 杂多县| 方山县| 泾阳县| 卢龙县| 日喀则市| 电白县| 南投县| 嘉义县| 道真| 大关县|