Async & Await

promise鏈

原來用promise的鏈式調(diào)用方式,then 中原本就返回了一個promise

new Promise(function(resolve, reject) {
  setTimeout(() => resolve(1), 3000); // (*)
}).then(function(result) { // (**)
  console.log(result); // 1
  return result * 2;   // 將返回的promise狀態(tài)改為resolved 
}).then(function(result) { // (***)
  console.log(result); // 2
  return result * 2;
}).then(function(result) {
  console.log(result); // 4
  return result * 2;
});
async

放在函數(shù)前面表示是異步函數(shù)悦析,異步函數(shù)也就意味著該函數(shù)的執(zhí)行不會阻塞后面代碼的執(zhí)行急灭。
函數(shù)前面的async一詞意味著一個簡單的事情:這個函數(shù)總是返回一個promise椭蹄,如果代碼中有return <非promise>語句衅檀,JavaScript會自動把返回的這個value值包裝成promise的resolved值灌闺,調(diào)用就像普通函數(shù)一樣調(diào)用呐粘,但是后面可以跟then()了

async function fn() {
    return 1
}
fn().then(alert) // 1

也可以顯式的返回一個promise,這個將會是同樣的結(jié)果:

async function f() {
  return Promise.resolve(1)
}
f().then(alert) // 1

async確保了函數(shù)返回一個promise蚂会,即使其中包含非promise淋样。

await

await只能在async函數(shù)里使用,它可以讓JavaScript進行等待胁住,直到一個promise執(zhí)行并返回它的結(jié)果趁猴,JavaScript才會繼續(xù)往下執(zhí)行。
await 可以用于等待的實際是一個返回值彪见,可是promise的返回值儡司,也可以是普通函數(shù)的返回值,或者使一個變量余指,注意到 await 不僅僅用于等 Promise 對象捕犬,它可以等任意表達式的結(jié)果跷坝,所以,await 后面實際是可以接普通函數(shù)調(diào)用或者直接變量的碉碉。
await不能在常規(guī)函數(shù)里使用await柴钻,不能工作在頂級作用域,只能在async函數(shù)中使用垢粮。

`定義一個await`
let  value = await promise  // value 可以得到promise成功后返回的結(jié)果, 然后才會繼續(xù)向下執(zhí)行
async function f() {    // await 只能在async函數(shù)中使用
    let promise = new Promise((resolve, reject) => {
        setTimeout(() => resolve('done!'), 1000)
    })
    let result = await promise   //  直到promise返回一個resolve值(*)才會執(zhí)行下一句
    alert(result) // 'done!' 
}
f()
function getSomething() {
    return "something";
}
async function testAsync() {
    return Promise.resolve("hello async");
}
const xxx = {a:1,b:2}
async function test() {
    const v1 = await getSomething();   // await 后跟普通函數(shù)的返回值
    const v2 = await testAsync();     // await 后跟異步函數(shù)的返回值
    const v3 = await  xxx
    console.log(v1, v2,v3);
}
test();

一個class方法同樣能夠使用async贴届,只需要將async放在實例方法之前就可以,它確保了返回值是一個promise蜡吧,支持await毫蚓。如下:

class Waiter {
   async wait () {
       return await Promise.resolve(1)
   }
}
new Waiter().wait().then(alert) // 1

await的異常處理
多個await連續(xù)時,會一個一個同步執(zhí)行昔善,如果中間有一個reject了元潘,就會停止后面的代碼執(zhí)行,所以需要用 try...catch處理錯誤
用try/catch 來捕獲異常君仆,把await 放到 try 中進行執(zhí)行翩概,如有異常,就使用catch 進行處理袖订。

 async getFaceResult () {
       try {
          let location = await this.getLocation(this.phoneNum);
           if (location.data.success) {
                   let province = location.data.obj.province;
                    let city = location.data.obj.city;
                    let result = await this.getFaceList(province, city);
                    if (result.data.success) {
                       this.faceList = result.data.obj;
                   }
               }
       } catch(err) {
            console.log(err);
       }
 }

摘自:async和await

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氮帐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子洛姑,更是在濱河造成了極大的恐慌上沐,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楞艾,死亡現(xiàn)場離奇詭異参咙,居然都是意外死亡,警方通過查閱死者的電腦和手機硫眯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門蕴侧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人两入,你說我怎么就攤上這事净宵。” “怎么了裹纳?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵择葡,是天一觀的道長。 經(jīng)常有香客問我剃氧,道長敏储,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任朋鞍,我火速辦了婚禮已添,結(jié)果婚禮上妥箕,老公的妹妹穿的比我還像新娘。我一直安慰自己更舞,他們只是感情好畦幢,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疏哗,像睡著了一般呛讲。 火紅的嫁衣襯著肌膚如雪禾怠。 梳的紋絲不亂的頭發(fā)上返奉,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音吗氏,去河邊找鬼芽偏。 笑死,一個胖子當著我的面吹牛弦讽,可吹牛的內(nèi)容都是我干的污尉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼往产,長吁一口氣:“原來是場噩夢啊……” “哼被碗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仿村,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锐朴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蔼囊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焚志,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年畏鼓,在試婚紗的時候發(fā)現(xiàn)自己被綠了酱酬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡云矫,死狀恐怖膳沽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情让禀,我是刑警寧澤挑社,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站堆缘,受9級特大地震影響滔灶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吼肥,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一录平、第九天 我趴在偏房一處隱蔽的房頂上張望麻车。 院中可真熱鬧,春花似錦斗这、人聲如沸动猬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赁咙。三九已至,卻和暖如春免钻,著一層夾襖步出監(jiān)牢的瞬間彼水,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工极舔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凤覆,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓拆魏,卻偏偏與公主長得像盯桦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渤刃,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容