Promise 和async/awiat

Promise

  1. Promise的作用续崖,promise如何進(jìn)行多個(gè)數(shù)據(jù)的請(qǐng)求
  • Promise對(duì)象代表一個(gè)異步操作敲街,有三種狀態(tài):
    Pending(進(jìn)行中);
    Resolved(已完成严望,又稱 Fulfilled)多艇;
    Rejected(已失敗)像吻。

  • Promise 就是用同步的方式寫異步的代碼峻黍,用來解決回調(diào)地獄

  • then()方法
    then 方法就是把原來的回調(diào)寫法分離出來复隆,在異步操作執(zhí)行完后,用鏈?zhǔn)秸{(diào)用的方式執(zhí)行回調(diào)函數(shù)姆涩。
    而 Promise 的優(yōu)勢(shì)就在于這個(gè)鏈?zhǔn)秸{(diào)用挽拂。我們可以在 then 方法中繼續(xù)寫 Promise 對(duì)象并返回,然后繼續(xù)調(diào)用 then 來進(jìn)行回調(diào)操作骨饿。

解決傳參的回調(diào)地獄

 new Promise((resolve,reject)=>{
              // 開始請(qǐng)求數(shù)據(jù)
                //  ajax()  //偽代碼
                // 當(dāng)數(shù)據(jù)回來之后調(diào)用 resolve(res)
                // 當(dāng)請(qǐng)求失敗之后調(diào)用 reject(err)

         })
        // api  http://www.baidu.com  ----> 商品ID A001 ---- > 商品的詳情  http://google.com? goodsid=A001 
        axios.get("http://www.baidu.com").then(res=>{

                return new Promise((resvole,reject)=>{
                    let goodsid = res.goodsId
                    axios.get('http://google.com?goodsid=A001').then(res=>{
                            resolve(res)
                    }).catch(err=>{
                          reject(err)
                    })
                })
        }).then(res=>{
             res.xxx
             return new Promise((resolve,reject)=>{
                    axios.get("xxxx?aa=xxx",).then(res=>{
                         resvole(res)
                     }).catch(err=>{
                         reject(res)
                     })
             })
        }).then()

命名三個(gè)函數(shù) p1 p2 p3運(yùn)用promise方法     
 
setTimeout() 方法用于在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式亏栈。

var p1,p2,p3
        p1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("foo");
            }, 3000);
        })
        p2 = new Promise((resolve, reject) => {
            setTimeout(() => {
                reject("oof");
            }, 500);
        })
        p3 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("ofo");
            }, 1000);
        })
Promise.all可以將多個(gè)Promise實(shí)例包裝成一個(gè)新的Promise實(shí)例。
同時(shí)宏赘,成功和失敗的返回值是不同的绒北,成功的時(shí)候返回的是一個(gè)結(jié)果數(shù)組,而失敗的時(shí)候則返回最先被reject失敗狀態(tài)的值察署。

 Promise.all([p1,p2,p3]).then(res=>{
    console.log(res)
    })
誰先完成就調(diào)用誰

Promise.race([p1,p2,p3]).then(res=>{
             console.log(res)
             console.log(111111)
        }).catch(err=>{
             console.log(err)
             console.log(222222)
        })

async/await

有一種特殊的語法可以更舒適地與promise協(xié)同工作闷游,它叫做async/await

函數(shù)前面的async意味著這個(gè)函數(shù)總是返回一個(gè)promise,如果代碼中有return 語句箕母,JavaScript會(huì)自動(dòng)把返回的這個(gè)value值包裝成promise的resolved值储藐。

async function f() {
    return 1
}

所以,async確保了函數(shù)返回一個(gè)promise嘶是,即使其中包含非promise钙勃;
還有另一個(gè)關(guān)鍵詞await,只能在async函數(shù)里使用聂喇。

關(guān)鍵詞await可以讓JavaScript進(jìn)行等待辖源,直到一個(gè)promise執(zhí)行并返回它的結(jié)果,JavaScript才會(huì)繼續(xù)往下執(zhí)行希太。

async function f() {
    let promise = new Promise((resolve, reject) => {
        setTimeout(() => resolve('done!'), 1000)
    })
    let result = await promise // 直到promise返回一個(gè)resolve值(*)
    alert(result) // 'done!' 
}
f()

函數(shù)執(zhí)行到(*)行會(huì)‘暫涂巳模’,當(dāng)promise處理完成后重新恢復(fù)運(yùn)行誊辉, resolve的值成了最終的result矾湃,所以上面的代碼會(huì)在1s后輸出'done!'

強(qiáng)調(diào)一下:await字面上使得JavaScript等待,直到promise處理完成堕澄,
然后將結(jié)果繼續(xù)下去邀跃。這并不會(huì)花費(fèi)任何的cpu資源,因?yàn)橐婺軌蛲瑫r(shí)做其他工作:執(zhí)行其他腳本蛙紫,處理事件等等拍屑。

這比promise更加容易閱讀和書寫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坑傅,一起剝皮案震驚了整個(gè)濱河市僵驰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖蒜茴,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件星爪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡矮男,警方通過查閱死者的電腦和手機(jī)移必,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毡鉴,“玉大人崔泵,你說我怎么就攤上這事≈硭玻” “怎么了憎瘸?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)陈瘦。 經(jīng)常有香客問我幌甘,道長(zhǎng),這世上最難降的妖魔是什么痊项? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任锅风,我火速辦了婚禮,結(jié)果婚禮上鞍泉,老公的妹妹穿的比我還像新娘皱埠。我一直安慰自己,他們只是感情好咖驮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布边器。 她就那樣靜靜地躺著,像睡著了一般托修。 火紅的嫁衣襯著肌膚如雪忘巧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天睦刃,我揣著相機(jī)與錄音砚嘴,去河邊找鬼。 笑死涩拙,一個(gè)胖子當(dāng)著我的面吹牛枣宫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吃环,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼洋幻!你這毒婦竟也來了郁轻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎好唯,沒想到半個(gè)月后竭沫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骑篙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蜕提,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靶端。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谎势,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杨名,到底是詐尸還是另有隱情脏榆,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布台谍,位于F島的核電站须喂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏趁蕊。R本人自食惡果不足惜坞生,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掷伙。 院中可真熱鬧是己,春花似錦、人聲如沸炎咖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乘盼。三九已至升熊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绸栅,已是汗流浹背级野。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粹胯,地道東北人蓖柔。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像风纠,于是被迫代替她去往敵國和親况鸣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • 原文連接:https://blog.csdn.net/sinat_17775997/article/details...
    小豆soybean閱讀 4,242評(píng)論 0 7
  • async 函數(shù) 含義 ES2017 標(biāo)準(zhǔn)引入了 async 函數(shù)懂酱,使得異步操作變得更加方便竹习。 async 函數(shù)是...
    huilegezai閱讀 1,257評(píng)論 0 6
  • 含義 async函數(shù)是Generator函數(shù)的語法糖,它使得異步操作變得更加方便列牺。 寫成async函數(shù)整陌,就是下面這...
    oWSQo閱讀 1,987評(píng)論 0 2
  • 簡(jiǎn)單介紹下這幾個(gè)的關(guān)系為方便起見 用以下代碼為例簡(jiǎn)單介紹下這幾個(gè)東西的關(guān)系, async 在函數(shù)聲明前使用asyn...
    _我和你一樣閱讀 21,216評(píng)論 1 24
  • Promise 對(duì)象 Promise 的含義 Promise 是異步編程的一種解決方案瞎领,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,702評(píng)論 1 56