你就需要這篇文章,帶你搞懂實戰(zhàn)的 Promise 對象

----歡迎查看我的博客----

什么是promise對象

??promise的誕生,是為了解決回調(diào)地獄,相信這個詞大家聽的比較多了。簡單說就是一個異步的方法完成后再觸發(fā)方法,再觸發(fā)下一個異步方法,再觸發(fā)方法,再觸發(fā)一個異步方法......周而復始,不停的callback,寫法非常繁瑣,因此es6中出現(xiàn)了promise對象。
??它早已不是一個新名詞。ES6中已經(jīng)原生對它加以支持,但是低版本的瀏覽器我們可以使用es6-promise這個polyfill庫來加以兼容。它有三種狀態(tài),分別是pending-進行中、resolved-已完成、rejected-已失敗。

image

ajax

??我們以ajax為例子,我們來看下傳統(tǒng)的ajax和promise包裹住的ajax,有什么區(qū)別,分析出來您大概就明白了

普通ajax

getData(method, url, successFun, failFun){
  var xmlHttp = new XMLHttpRequest();
  xmlHttp.open(method, url);
  xmlHttp.send();
  xmlHttp.onload = function () {
    if (this.status == 200 ) {
      successFun(this.response);
    } else {
      failFun(this.statusText);
    }
  };
  xmlHttp.onerror = function () {
    failFun(this.statusText);
  };
}
getData('get','www.xxx.com',()=>{...},()=>{...})

promise包裹的

getData(method, url){
    var promise = new Promise(function(resolve, reject){
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open(method, url);
    xmlHttp.send();
    xmlHttp.onload = function () {
      if (this.status == 200 ) {
        resolve(this.response);
      } else {
        reject(this.statusText);
      }
    };
    xmlHttp.onerror = function () {
      reject(this.statusText);
    };
  })
  return promise;
}

getData('get','www.xxx.com').then(...).catch(
    (err) => { console.log(err) }
)

??看完上面兩個例子,應該都知道promise是什么了吧。說白了只不過是換了種寫法,其實本質(zhì)還是一樣的,所以大家沒必要對新東西恐懼。其實就這樣了。

Promise使用方法

??promise有這么幾種方法,用來調(diào)用promise對象。

resolve()方法

??上面樣例我們通過 resolve 方法把 Promise 的狀態(tài)置為完成態(tài),ajax200狀態(tài),這時 then 方法就能捕捉到變化,并執(zhí)行“成功”情況的回調(diào)。

reject()方法

??而 reject 方法就是把 Promise 的狀態(tài)置為已失敗,這時 then 方法執(zhí)行“失敗”情況的回調(diào)。

then()方法

??簡單來講,then 方法就是把原來的回調(diào)寫法分離出來,在異步操作執(zhí)行完后,用鏈式調(diào)用的方式執(zhí)行回調(diào)函數(shù)。而 Promise 的優(yōu)勢就在于這個鏈式調(diào)用。我們可以在 then 方法中繼續(xù)寫 Promise 對象并返回,然后繼續(xù)調(diào)用 then 來進行回調(diào)操作.這個就不多說了,上面代碼有例子

catch()方法

??就是拋異常,promise通過reject方法失敗后的方法通過catch的方法去拋異常拋出來。通過then的方法將他catch出來。其實非常簡單,沒什么可以講的。

Promise.all()

??promise對象組成的數(shù)組作為參數(shù),并返回一個新的promise對象。

function timeout(time) {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve(time);
        }, time);
    });
}
console.time('promise')
Promise.all([
    timeout(10),
    timeout(60),
    timeout(100)
]).then(function (values) {
    console.log(values); [10, 60, 100]
    console.timeEnd('promise');   // 101ms
});

??由此我們可以看出,傳入的多個對象幾乎是同時執(zhí)行的,因為總的時間略大于用時最長的一個對象resolve的時間。我理解的 是根據(jù)你的計算機配置來計算最多執(zhí)行幾個promise,這個就很有利用點了,比如多個promise對象,for循環(huán)同時執(zhí)行,我們可以考慮將所有的promise對象組成一個promise數(shù)組,然后.all去完成大量的請求。非常有用。

race()方法

??race 按字面解釋,就是賽跑的意思。race 的用法與 all 一樣,只不過 all 是等所有異步操作都執(zhí)行完畢后才執(zhí)行 then 回調(diào)。而 race 的話只要有一個異步操作執(zhí)行完畢,就立刻執(zhí)行 then 回調(diào)。我們來把all換成race方法。

function timeout(time) {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve(time);
        }, time);
    });
}
console.time('promise')
Promise.race([
    timeout(10),
    timeout(60),
    timeout(100)
]).then(function (values) {
    console.log(values); //10
    console.timeEnd('promise');   // 11.75ms
});

??與Promise.all()不同,它是在數(shù)組中有一個對象(最早改變狀態(tài))resolve或reject時,就改變自身的狀態(tài),并執(zhí)行響應的回調(diào)。

如何取消 promise

??在這篇文章中有提到這里就不多說了,請看這里 ajax 和 fetch 和 axios 的區(qū)別 。

結(jié)語

??好了今天的promise就講到這里,如果更往深層次研究,坑肯定 還是有的,例如promise不能取消,后面我們有時間在詳細說說這個玩意,好了不說了,困死我了今天,昨晚看人民的民義,我去硬是看完了大結(jié)局,精彩是精彩的,就是官二代有點多。。。哈哈哈,不說了拜拜

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,832評論 1 56
  • 00、前言Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強大。它由社區(qū)...
    夜幕小草閱讀 2,225評論 0 12
  • 一、Promise的含義 Promise在JavaScript語言中早有實現(xiàn),ES6將其寫進了語言標準,統(tǒng)一了用法...
    Alex灌湯貓閱讀 887評論 0 2
  • 目錄:Promise 的含義基本用法Promise.prototype.then()Promise.prototy...
    BluesCurry閱讀 1,563評論 0 8
  • 前言 本文旨在簡單講解一下javascript中的Promise對象的概念,特性與簡單的使用方法。并在文末會附上一...
    _暮雨清秋_閱讀 2,312評論 0 3

友情鏈接更多精彩內(nèi)容