ES6的Promise到底咋回事

一姥芥、簡(jiǎn)介

Promise是異步編程的一種解決方法,比傳統(tǒng)的回調(diào)函數(shù)和事件更合理更強(qiáng)大岳守。ES6將其寫進(jìn)js語(yǔ)言標(biāo)準(zhǔn),統(tǒng)一了用法碌冶,原生提供了promise對(duì)象湿痢。所謂Promise“承諾”,就是保存著未來(lái)會(huì)發(fā)生的事情扑庞,Promise有三種狀態(tài):pending(“進(jìn)行中”)譬重,fulfilled(“已成功”),rejected(“已失敗”)罐氨,并且一旦進(jìn)入后兩種狀態(tài)就不可更改臀规,它的狀態(tài)之手異步操作結(jié)果控制。

二栅隐、用法:

新建一個(gè)Promise對(duì)象:

var promise = new Promise(function(resolve,reject){

    //some code

    if(success){ //異步操作成功

        resolve(value);

    }else{ //異步操作失敗

        reject(error);

    }

  })

Promise構(gòu)造函數(shù)接收一個(gè)函數(shù)作為參數(shù)塔嬉,它的兩個(gè)參數(shù)resolve和reject,是兩個(gè)函數(shù)租悄,由JavaScript引擎提供谨究,不用自己部署。

resolve函數(shù)的作用是:將Promise的狀態(tài)從“pending”變?yōu)椤皉esolve”泣棋,在異步操作成功時(shí)調(diào)用胶哲,并將異步操作的結(jié)果作為參數(shù)傳遞出去;

reject函數(shù)的作用是:將Promise狀態(tài)從“pending”變?yōu)椤皉eject”潭辈,在異步操作失敗時(shí)調(diào)用鸯屿,并將異步操作報(bào)出的錯(cuò)誤作為參數(shù)傳遞出去。

axios就是基于Promise的用于瀏覽器和node的http客戶端把敢,下面是在所作項(xiàng)目中axios的用法寄摆,是搜索頁(yè)面的接口。其中的then就是resolve的內(nèi)容技竟,catch就是reject的內(nèi)容冰肴。當(dāng)然,self.getRequest是用axios封裝后的全局變量榔组。

  let url = 'search/' + self.searchType;

                let model = {};

                let page = self.currentPage - 1;

                model = {

                    searchValue: self.searchValue,

                    page: page,

                    size: 10,

                    operatingStatus: self.operatingStatus,

                    establishTimeType: self.establishTimeType,

                };

                self.getRequest(url, model).then((res) => {

                    self.successCallBack(res);

                }).catch(err => {

                    console.log(err);

                    self.nodata = true;

                    self.loading = false;

                });

異步操作拋出錯(cuò)誤狀態(tài)成reject熙尉,或then方法指定的回調(diào)函數(shù)中發(fā)生錯(cuò)誤,就會(huì)被catch方法捕獲搓扯。Promise的錯(cuò)誤具有冒泡性質(zhì)检痰,可以一直向后傳遞到被最后一個(gè)catch捕獲。

封裝axios的get請(qǐng)求锨推,作為全局變量使用铅歼。

export const getRequest = (url, params) => {

return axios({

      method: 'get',

      url: url,

      params: params,

  });

}

三公壤、其他后臺(tái)接口獲取數(shù)據(jù)方式

1、jquery ajax訪問(wèn)后臺(tái)接口獲取數(shù)據(jù):

$.ajax({

    type: 'post',

    url: '/login',

    data: {

        //傳遞到后臺(tái)的參數(shù) 沒(méi)有則不寫

        user_name: name,

        password: password

    },

    dataType: 'json',

    success(res) {

        if(res.msgCode == 0){

            //alert('登錄成功!');

            window.location.href = '/';

        }else{

            alert("錯(cuò)誤碼:" + res.msgCode + "椎椰," + res.msg);

            window.location.href = '/';

        }

    },

    error(err) {

        alert('登錄失敗!錯(cuò)誤信息:'+ err);

        return;

    }

});

2厦幅、原生ajax范文后臺(tái)接口獲取數(shù)據(jù):

    var XHR=null; 

    var url = '';

    if (window.XMLHttpRequest) {

      XHR = new XMLHttpRequest();  // 非IE內(nèi)核 

    } else if (window.ActiveXObject) {

      XHR = new ActiveXObject("Microsoft.XMLHTTP");  // IE內(nèi)核,這里早期IE的版本寫法不同,具體可以查詢下

    } else { 

      XHR = null; 

    } 

    if(XHR){ 

    XHR.open("GET", url); 

    XHR.onreadystatechange = function () { 

        // readyState值說(shuō)明 

        // 0,初始化,XHR對(duì)象已經(jīng)創(chuàng)建,還未執(zhí)行open 

        // 1,載入,已經(jīng)調(diào)用open方法,但是還沒(méi)發(fā)送請(qǐng)求 

        // 2,載入完成,請(qǐng)求已經(jīng)發(fā)送完成 

        // 3,交互,可以接收到部分?jǐn)?shù)據(jù) 

        if (XHR.readyState == 4 && XHR.status == 200) { 

            // 這里可以對(duì)返回的內(nèi)容做處理 

            // 一般會(huì)返回JSON或XML數(shù)據(jù)格式 

            console.log(XHR.responseText); 

            // 主動(dòng)釋放,JS本身也會(huì)回收的 

            XHR = null; 

        } 

    }; 

    XHR.send(); 

}

四、方法

1慨飘、Promise.prototype.then()

then方法返回的是一個(gè)新的 Promise 實(shí)例(注意确憨,不是原來(lái)那個(gè) Promise 實(shí)例)。因此可以采用鏈?zhǔn)綄懛ㄈ康模磘hen方法后面再調(diào)用另一個(gè)then方法休弃。

login(param).then(function(post) {

  return param;

  }).then(res=> {

      console.log("Resolved: ", res);

  }, err=>{

      console.log("Rejected: ", err);

});

第二個(gè)then方法指定的回調(diào)函數(shù)會(huì)等待這個(gè)新的 Promise 對(duì)象狀態(tài)發(fā)生變化。如果變?yōu)?Resolved打印res圈膏,如果狀態(tài)變?yōu)?Rejected打印err塔猾。

2、Promise.resolve()

將現(xiàn)有對(duì)象轉(zhuǎn)為 Promise 對(duì)象

Promise.resolve('foo')

// 等價(jià)于

new Promise(resolve => resolve('foo'))

3稽坤、Promise.reject()

返回一個(gè)新的 Promise 實(shí)例丈甸,該實(shí)例的狀態(tài)為rejected。

var p = Promise.reject(' 出錯(cuò)了 ');

// 等同于

var p = new Promise((resolve, reject) => reject(' 出錯(cuò)了 '))

p.then(null, function (s){

  console.log(s)

});

參考:es6 Promise用法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慎皱,一起剝皮案震驚了整個(gè)濱河市老虫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茫多,老刑警劉巖祈匙,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異天揖,居然都是意外死亡夺欲,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門今膊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)些阅,“玉大人,你說(shuō)我怎么就攤上這事斑唬∈新瘢” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵恕刘,是天一觀的道長(zhǎng)缤谎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)褐着,這世上最難降的妖魔是什么坷澡? 我笑而不...
    開(kāi)封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮含蓉,結(jié)果婚禮上频敛,老公的妹妹穿的比我還像新娘项郊。我一直安慰自己,他們只是感情好斟赚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布着降。 她就那樣靜靜地躺著,像睡著了一般汁展。 火紅的嫁衣襯著肌膚如雪鹊碍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天食绿,我揣著相機(jī)與錄音,去河邊找鬼公罕。 笑死器紧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的楼眷。 我是一名探鬼主播铲汪,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼罐柳!你這毒婦竟也來(lái)了掌腰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤张吉,失蹤者是張志新(化名)和其女友劉穎齿梁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肮蛹,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勺择,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伦忠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片省核。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昆码,靈堂內(nèi)的尸體忽然破棺而出气忠,到底是詐尸還是另有隱情,我是刑警寧澤赋咽,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布旧噪,位于F島的核電站,受9級(jí)特大地震影響冬耿,放射性物質(zhì)發(fā)生泄漏舌菜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一亦镶、第九天 我趴在偏房一處隱蔽的房頂上張望日月。 院中可真熱鬧袱瓮,春花似錦、人聲如沸爱咬。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)精拟。三九已至燎斩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜂绎,已是汗流浹背栅表。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留师枣,地道東北人怪瓶。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像践美,于是被迫代替她去往敵國(guó)和親洗贰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • Promise 對(duì)象 Promise 的含義 Promise 是異步編程的一種解決方案陨倡,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,706評(píng)論 1 56
  • 本文適用的讀者 本文寫給有一定Promise使用經(jīng)驗(yàn)的人敛滋,如果你還沒(méi)有使用過(guò)Promise,這篇文章可能不適合你兴革,...
    HZ充電大喵閱讀 7,307評(píng)論 6 19
  • 00帖旨、前言Promise 是異步編程的一種解決方案箕昭,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。它由社區(qū)...
    夜幕小草閱讀 2,133評(píng)論 0 12
  • Prepending(進(jìn)行時(shí))解阅,Resolve(成功了)落竹,Reject(失敗了),then......等 1.Pr...
    _菩提本無(wú)樹(shù)_閱讀 49,055評(píng)論 0 21
  • Promiese 簡(jiǎn)單說(shuō)就是一個(gè)容器货抄,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果述召,語(yǔ)法上說(shuō),Pr...
    雨飛飛雨閱讀 3,358評(píng)論 0 19