簡(jiǎn)單理解Promise

概念

我理解的Promise就是一套為處理異步情況的方法。先創(chuàng)建一個(gè)promise對(duì)象來(lái)注冊(cè)一個(gè)委托,其中包括委托成功及失敗后的處理函數(shù)。然后基于這種表述方式,來(lái)將promise應(yīng)用到各種異步處理的情況中。

Promise的一個(gè)寫法案例

var promise = getAsyncPromise('fileA.txt');
promise.then( function(result){
      // 成功時(shí)的處理辦法
}).catch( function(error){
      // 失敗時(shí)的處理辦法
})

// 返回一個(gè)promise對(duì)象

基于這種統(tǒng)一的書寫方式,就可以簡(jiǎn)便的實(shí)現(xiàn)回調(diào),不需要去設(shè)計(jì)函數(shù)的名字,同時(shí)因?yàn)榉祷氐氖莗romise對(duì)象,可是實(shí)現(xiàn)連續(xù)的then調(diào)用。

使用Promise

一般情況下,我們會(huì)使用new Promise()來(lái)創(chuàng)建promise對(duì)象。
比如在一個(gè)AJAX請(qǐng)求中,使用promise來(lái)寫:

function ajax(options){
   return new Promise(resolve, reject){
     let {method, url} = options;
     let xhr = new XMLHttpRequest();
     xhr.open(method,url);
     xhr.readystatechange = function(){
          if(xhr.readystate >=200 && xhr.readystate<400){
              resolve.call(null,xhr.responseText)
          }else if(xhr.readystate >= 400){
              reject.call(null,xhr.status)
          }
        }
     }
    xhr.send();
}

調(diào)用如下:

ajax({method:'GET',url:'www.baidu.com' })
  .then(function(responseText){
    console.log('我成功了')
    console.log(responseText)
  },function(status){
    console.log('我失敗了')
    console.log(status)
  }
)

使用promise,對(duì)于異步的處理更加清晰簡(jiǎn)潔,一目了然,且promise支持鏈?zhǔn)秸{(diào)用,所以甚至可以這么用

promise.then(resolve,reject).then(resolve,reject)

其中的resolve和reject分別代表成功和失敗的函數(shù)。

兩個(gè)常用的Promise API

Promise.all ([promise1,promise2..])

返回一個(gè)新的Promise對(duì)象,當(dāng)該promise對(duì)象內(nèi)的參數(shù)對(duì)象都成功的狀態(tài)下才會(huì)觸發(fā)成功,有一個(gè)失敗則立即觸發(fā)失敗。

Promise.race ([promise1,promise2..])

當(dāng)參數(shù)里的任意一個(gè)promise成功或失敗后,該函數(shù)就會(huì)返回,并使用這個(gè)promise對(duì)象的值進(jìn)行resolve或reject

基本用法如下:

    let promise1 = ajax({method:'GET',url:'/x.json'});
    let promise2 = ajax({method:'GET',url:'/y.json'});
    Promise.all([promise1,promise2]).then(function(){
        console.log('兩個(gè)promise都執(zhí)行完成了')
    });
    Promise.race([promise1,promise2]).then(function(){
        console.log('有一個(gè)promise先執(zhí)行完成了')
    })
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 本文適用的讀者 本文寫給有一定Promise使用經(jīng)驗(yàn)的人,如果你還沒有使用過(guò)Promise,這篇文章可能不適合你,...
    HZ充電大喵閱讀 7,448評(píng)論 6 19
  • Promiese 簡(jiǎn)單說(shuō)就是一個(gè)容器,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果,語(yǔ)法上說(shuō),Pr...
    雨飛飛雨閱讀 3,484評(píng)論 0 19
  • 00、前言Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。它由社區(qū)...
    夜幕小草閱讀 2,219評(píng)論 0 12
  • 你不知道JS:異步 第三章:Promises 在第二章,我們指出了采用回調(diào)來(lái)表達(dá)異步和管理并發(fā)時(shí)的兩種主要不足:缺...
    purple_force閱讀 2,233評(píng)論 0 4
  • 這一路想了很多 終點(diǎn)再遠(yuǎn) 也會(huì)有到達(dá)的那一刻 人生再長(zhǎng) 也會(huì)慢慢被我們消磨殆盡 很多時(shí)候 總在抱怨自己沒有別人優(yōu)秀...
    樂樂閱讀 203評(píng)論 0 0

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