ES6學習筆記---Promise和異步函數

引言

在Javasc里面,所有的代碼都是單線程執(zhí)行的祭衩,所以導致JS中所有的事件都必須異步執(zhí)行浴井。比如setTimeout(callback,1000),異步執(zhí)行一般是通過調用回調函數來實現锋八,用的最多的ajax

request.onreadystatechange = function () {
    if (request.readyState === 4) {
        if (request.status === 200) {
            return success(request.responseText);
        } else {
            return fail(request.status);
        }
    }
}

把回調函數寫在ajax里面,既不好看也不利于代碼復用护盈,所以Promise出來了

正文

Promise的語法

new Promise(function(resolve,reject){   //實例一個promise對象
      if(true){
        resolve("aaaa");  //promise的第一個參數挟纱,表示成功,接下來會執(zhí)行then()
      }else{
        reject("bbbbb");  //同上腐宋,表示失敗紊服,接下來會執(zhí)行catch()
      }
  })      //執(zhí)行函數
.then(function(result){console.log(result)}) //resolve調用then()  輸出"aaaa"
.catch(function(reason){console.log(reason)}) //reject調用catch() 輸出"bbbbb"

Promise的特點

  1. 對象的狀態(tài)不受外界干擾檀轨,也就是說一旦執(zhí)行了就停不下來,而且執(zhí)行結果也無法更改欺嗤。promise有三種狀態(tài):pending(執(zhí)行中),fulfilled(成功),rejected(失敗)参萄。這三個狀態(tài)其實就是個概念,沒甚用煎饼。
  2. 狀態(tài)改變后就不會再變讹挎,也就是說函數執(zhí)行完好久好久了,給它加個回調函數它仍然能立即返回結果吆玖。

Promise連環(huán)使用

new Promise().then().then().then().catch()

上面的代碼依次指定了三個回調函數筒溃,第一then()執(zhí)行完(必須包含return語句),將返回結果作為參數傳給下一個then()

then()有兩個參數衰伯,then(function(){},function(){})第一個是resolve的回調函數铡羡,第二個可選參數是reject的回調函數,相當于catch()意鲸。不過一般不會這樣用烦周,因為Promise對象的錯誤有冒泡的特性,會一直傳遞怎顾,上面例子的catch()語句可以捕獲三個then()里面的錯誤读慎,當捕獲到錯誤時,后面的then()就會跳過槐雾,不再執(zhí)行夭委。

Promise的執(zhí)行順序

new Promise(function(resolve,reject){
    console.log(1)
    setTimeout(function(){
       console.log(2)
  },101)
  resolve()
}).then(function(res){
    console.log(3)
});
console.log(4)
setTimeout(function(){
    console.log(5)
},100)

結果是 1 4 3 5 2

粗淺分析:假如上面的代碼是一個線程的,那么setTimeout()其實是在下一個線程上執(zhí)行募强,new Promise()的參數函數時立即執(zhí)行的株灸,Promisethen()這是這當前線程的最末尾執(zhí)行,所以setTimeout()時最晚執(zhí)行的擎值,先輸出5慌烧,是因為一個是100ms,一個是101ms

finally語句

new Promise().then().catch().finally()

跟try..catch語句一樣鸠儿,finally不管怎樣都要執(zhí)行的

Promise.all()

Promise.all([p1,p2,p3]).then()

參數是Promise實例的數組屹蚊,當P1,P2,P3都執(zhí)行完的時候再執(zhí)行then()

var p1 = new Promise(function(resolve,reject){
    resolve(1)
})
var p2 = new Promise(function(resolve,reject){
    resolve(2)
})
Promise.all([p1,p2]).then(function(res){
    console.log(res)   //[1,2]
})

then()接收的值是所有實例對象返回值組成的數組

Proomise.race()

Promise.race([p1,p2,p3]).then()

Promise.all()類似,不同的是race哪個實例先執(zhí)行完立馬調用then()

引出async

Promise有一種情況进每,ajax請求接口返回id,用返回的id去ajax請求另外一個接口,用Promise實現如下:

var p1 = new Promise(function(resolve,reject){
    setTimeout(function(){resolve(1)},100);
})
p1.then(function(id){
    new Promise(function(resolve,reject){
    setTimeout(function(){resolve(id+1)},100);
}).then(function(name){
    console.log(name)
})
})

這僅僅是一次嵌套而且代碼簡單可讀性就很差汹粤,如果多次嵌套那絕對看眼花,所以引入async函數,用async重寫

(async function(){
    let id = await new Promise(resolve => setTimeout(()=>resolve(1),100))
    let name  = await new Promise(resolve => setTimeout(()=>resolve(id+1),100))
    console.log(name)
})()

從上至下田晚,一目了然

異步函數

存在的意義:提高promise的可讀性

語法:

async function mytest(){
    try{
        const returnValue = await promise;
    }
    catch(rejectedValue){
        //
    }
}

如果在函數開頭使用關鍵字async,就可以在函數里面使用await,當await
某個promise時嘱兼,函數會暫停執(zhí)行,直到該promise產生結果贤徒,并且暫停不會阻塞
主線程芹壕。

示例

function logFetch() {
    return fetch(url).then(response => responset.text())
    .then(text => {
        console.log(text);
    }).catch(err => {
        console.log(err);
    })
}

使用異步函數重寫

async function logFetch() {
    try{
        var response = awit fetch(url);
        console.log(response.text());
    }
    catch(err){
        console.log(err);
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末胃惜,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子哪雕,更是在濱河造成了極大的恐慌,老刑警劉巖鲫趁,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斯嚎,死亡現場離奇詭異,居然都是意外死亡挨厚,警方通過查閱死者的電腦和手機堡僻,發(fā)現死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疫剃,“玉大人钉疫,你說我怎么就攤上這事〕布郏” “怎么了牲阁?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長壤躲。 經常有香客問我城菊,道長,這世上最難降的妖魔是什么碉克? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任凌唬,我火速辦了婚禮,結果婚禮上漏麦,老公的妹妹穿的比我還像新娘客税。我一直安慰自己,他們只是感情好撕贞,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布更耻。 她就那樣靜靜地躺著,像睡著了一般麻掸。 火紅的嫁衣襯著肌膚如雪酥夭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天脊奋,我揣著相機與錄音熬北,去河邊找鬼。 笑死诚隙,一個胖子當著我的面吹牛讶隐,可吹牛的內容都是我干的。 我是一名探鬼主播久又,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼巫延,長吁一口氣:“原來是場噩夢啊……” “哼效五!你這毒婦竟也來了?” 一聲冷哼從身側響起炉峰,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤畏妖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疼阔,有當地人在樹林里發(fā)現了一具尸體戒劫,經...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年婆廊,在試婚紗的時候發(fā)現自己被綠了迅细。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡淘邻,死狀恐怖茵典,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情宾舅,我是刑警寧澤统阿,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站贴浙,受9級特大地震影響砂吞,放射性物質發(fā)生泄漏。R本人自食惡果不足惜崎溃,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一蜻直、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧袁串,春花似錦概而、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至破镰,卻和暖如春餐曼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鲜漩。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工源譬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孕似。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓踩娘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親喉祭。 傳聞我的和親對象是個殘疾皇子养渴,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內容

  • Promiese 簡單說就是一個容器雷绢,里面保存著某個未來才會結束的事件(通常是一個異步操作)的結果,語法上說理卑,Pr...
    雨飛飛雨閱讀 3,352評論 0 19
  • 弄懂js異步 講異步之前翘紊,我們必須掌握一個基礎知識-event-loop。 我們知道JavaScript的一大特點...
    DCbryant閱讀 2,706評論 0 5
  • Promise含義 Promise是異步編程的一種解決方案藐唠,比傳統(tǒng)的解決方案——回調函數和事件——更強大霞溪。所謂Pr...
    oWSQo閱讀 1,083評論 0 4
  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調函...
    neromous閱讀 8,702評論 1 56
  • 來這寫日記才想起工作匯總沒寫中捆,挽救了我一頓飯錢呀。 今天看的是有點技術含量的視頻坊饶,ctrl+A是全選泄伪,要排序和篩選...
    LULU謝大露閱讀 60評論 0 0