promise的使用

JS中的promise

promise對象用于表示一個異步操作的最終完成 (或失敗),及其結(jié)果值。屬于ES6語法中的內(nèi)容。
用于處理異步問題杈曲。
單線程是js的痛點驰凛,因此,如何解決單線程問題担扑,引用了異步的概念恰响,用異步來模擬多線程的用法。其中ajax是典型的利用異步加載數(shù)據(jù)魁亦,實現(xiàn)數(shù)據(jù)刷新的案例渔隶。
但在處理多個有相互依賴關(guān)系的異步操作時,便會出現(xiàn)回調(diào)地獄洁奈。

//以ajax距離---回調(diào)地獄
ajax(function(){
    ajax(function(){
            ajax(function(){
                ajax(function(){
                    
                })
            })
        })
    })

極大的影響程序的運行间唉,占用內(nèi)存。

因此利术,promise提供了很好的解決方式呈野,用于解決這些問題。
promise對象是一個代理對象(代理一個值)印叁,被代理的值在promise對象創(chuàng)建時可能是未知的被冒。它允許為異步操作的成功和失敗分別綁定相應(yīng)的處理方法,但不是立即返回執(zhí)行結(jié)果轮蜕,而是返回成功或失敗的狀態(tài)昨悼。
語法new Promise( function(resolve, reject) {...}
promise有以下幾種狀態(tài):

  • pending:初始狀態(tài),既不是成功跃洛,也不是失敗
  • fulfilled:意味著操作成功
  • rejected:意味著操作失敗

then()方法

在初始狀態(tài)時率触,promise對象可能變成fulfilled狀態(tài)并返回一個相應(yīng)的狀態(tài)處理方法,也可能變成rejected狀態(tài)并返回一個失敗信息汇竭。當(dāng)其中一種情況出現(xiàn)時葱蝗,promise狀態(tài)便不會改變,而是成為其中的一種狀態(tài)细燎,promise的then方法綁定的處理方法handlers便會被調(diào)用两曼。其中then方法中綁定了兩個參數(shù):onfulfilled 和 onrejected,當(dāng)返回的狀態(tài)是fulfilled玻驻,調(diào)用onfulfilled方法悼凑,當(dāng)返回的狀態(tài)是rejected,調(diào)用onrejected方法击狮。
在promise的語法中佛析,new Promise( function(resolve, reject) {...}當(dāng)promise被new創(chuàng)建時,會有resolve, reject這兩個參數(shù)彪蓬。其中當(dāng)異步任務(wù)成功并返回結(jié)果值是,會調(diào)用resolve函數(shù)捺萌;而當(dāng)異步任務(wù)失敗并返回失敗原因時档冬,會調(diào)用reject函數(shù)膘茎。
以ajax為例:

function ajaxGet(url,data){
    data = data || {};
    var str = "";
    for(var i in data){
        str = str + i+"="+data[i]+"&";
    }
    var d = new Date();
    url = url + "?" + str + "__htnt="+d.getTime();
    var p = new Promise((resolve,reject)=>{
        var xhr = new XMLHttpRequest();
        xhr.open("get",url,true);
        xhr.onreadystatechange = function(){
            if(xhr.readyState == 4 && xhr.status == 200){
                resolve(xhr.responseText);
            }else if(xhr.readyState == 4 && xhr.status != 200){
                reject(xhr.status)
            }
        }
        xhr.send();
    });
    return p;
}

在這個ajax-get封裝中,當(dāng)傳輸成功時酷誓,則將成功后得到數(shù)據(jù)返回作為參數(shù)返回給resolve函數(shù)披坏;當(dāng)失敗時,將失敗狀態(tài)作為參數(shù)返回給reject函數(shù)盐数。

假設(shè)此時它有返回值棒拂,且 var p = ajaxGet(...)

p.then(function(data){
    console.log("成功");
    console.log('返回值為:',data);
},function(data){
    console.log("失敗");
    console.log("錯誤代碼:",data);
})

還可以在p.then(function(){})再加上.then(function(){}).then(function(){})

p.then(function(){
            
}).then(function(){
    
}).then(function(){
    
})...

可以將第一次異步得到的數(shù)據(jù)傳到第一個then中,然后在將從第一個then中處理的數(shù)據(jù)進行第二次異步操作玫氢,并傳遞結(jié)果帚屉,依次往下傳遞。

catch()方法

添加一個拒絕(rejection)回調(diào)到當(dāng)前 promise, 返回一個新的promise漾峡。只用來捕獲失敗狀態(tài)攻旦。

finally()方法 --ES2018

finally添加一個事件處理回調(diào)與當(dāng)前promise對象,并且在原promise對象解析完畢后生逸,返回一個新的promise對象。無論結(jié)果是fulfilled或者是rejected,都會執(zhí)行指定的回調(diào)函數(shù)荧飞。避免了同樣的語句需要在then()和catch()中各寫一次的情況毫捣。

all()方法

假設(shè)情況如下:

var p1 = ajaxGet(...);
var p2 = ajaxGet(...);
var p3 = ajaxGet(...);
Promise.all([p1,p2,p3]).then(function(res){
    console.log(res);
},function(res){
    console.log(res);
})

all()的參數(shù)應(yīng)是一個數(shù)組。當(dāng)在這個數(shù)組中所有的promise對象都成功才會觸發(fā)成功遍尺,并把數(shù)組中所有promise返回值的數(shù)組作為成功回調(diào)的返回值截酷,順序與數(shù)組中一致。若有任一個對象失敗狮鸭。則會觸發(fā)該primise對象的失敗合搅,并將第一個觸發(fā)失敗的promise對象的錯誤信息作為它的失敗狀態(tài)。

race()方法

all()是等所有的異步操作都執(zhí)行完了再執(zhí)行then()方法歧蕉,那么race()方法就是相反的灾部,誰先執(zhí)行完成就先執(zhí)行回調(diào)。

參考地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惯退,一起剝皮案震驚了整個濱河市赌髓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌催跪,老刑警劉巖锁蠕,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異懊蒸,居然都是意外死亡荣倾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門骑丸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舌仍,“玉大人妒貌,你說我怎么就攤上這事≈恚” “怎么了灌曙?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長节芥。 經(jīng)常有香客問我在刺,道長,這世上最難降的妖魔是什么头镊? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任蚣驼,我火速辦了婚禮,結(jié)果婚禮上拧晕,老公的妹妹穿的比我還像新娘隙姿。我一直安慰自己,他們只是感情好厂捞,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布输玷。 她就那樣靜靜地躺著,像睡著了一般靡馁。 火紅的嫁衣襯著肌膚如雪欲鹏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天臭墨,我揣著相機與錄音赔嚎,去河邊找鬼。 笑死胧弛,一個胖子當(dāng)著我的面吹牛尤误,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播结缚,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼损晤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了红竭?” 一聲冷哼從身側(cè)響起尤勋,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茵宪,沒想到半個月后最冰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡稀火,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年暖哨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凰狞。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹿蜀,死狀恐怖箕慧,靈堂內(nèi)的尸體忽然破棺而出服球,到底是詐尸還是另有隱情茴恰,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布斩熊,位于F島的核電站往枣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粉渠。R本人自食惡果不足惜分冈,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霸株。 院中可真熱鬧雕沉,春花似錦、人聲如沸去件。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尤溜。三九已至倔叼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宫莱,已是汗流浹背丈攒。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留授霸,地道東北人巡验。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像碘耳,于是被迫代替她去往敵國和親显设。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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

  • 什么叫promise? 那我們?yōu)槭裁匆褂胮romise藏畅? 比如我們在工作中經(jīng)常會碰到這么一個需求敷硅,比如我使用aj...
    紫陌蘭溪閱讀 14,643評論 2 5
  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,706評論 1 56
  • 前言 本文旨在簡單講解一下javascript中的Promise對象的概念愉阎,特性與簡單的使用方法绞蹦。并在文末會附上一...
    _暮雨清秋_閱讀 2,200評論 0 3
  • 1.Promise的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和...
    lhdoeo閱讀 150評論 0 1
  • Promise 是異步編程的一種解決方案榜旦。簡單來說 Promise 就是一個容器幽七,里面保存著某個未來才會結(jié)束的異步...
    點融黑幫閱讀 786評論 0 13