ES6之Promise


Promise開(kāi)篇

因?yàn)閖avascript異步機(jī)制,導(dǎo)致一個(gè)常見(jiàn)的問(wèn)題,回調(diào)金字塔:

loadImg('a.jpg', function() {
    loadImg('b.jpg', function() {
        loadImg('c.jpg', function() {
            console.log('all done!');
        });
    });
});

Promise 字面意思,承諾。如果A調(diào)用B,B返回一個(gè)承諾給A,然后A就可以寫計(jì)劃時(shí)這么寫:當(dāng)B返回結(jié)果給我的時(shí)候,A執(zhí)行S1方案,反之如果B因?yàn)槭裁丛驔](méi)有給A想要的結(jié)果,那么A執(zhí)行應(yīng)急方案S2,這樣的話,所有潛在風(fēng)險(xiǎn)都在A的控制范圍內(nèi)

var resB = B();
var runA = function(){
   resB.then(execS1,execS2);
};

如果A要完成一件事,可能依賴的不是B一個(gè)響應(yīng),那么上面的代碼就會(huì)變成

var resB = B();
var resC = C();
...
 
var runA = function() {
    reqB
        .then(resC, execS2)
        .then(resD, execS3)
        .then(resE, execS4)
        ...
        .then(execS1);
};
 
runA();

在這里,每當(dāng)一個(gè)詢問(wèn)者做出不符合預(yù)期的應(yīng)答的時(shí)候都用了不同的處理機(jī)制,雖然,Promise規(guī)范沒(méi)有要求這樣做,甚至可以不做任何處理,即(不傳入then的第二個(gè)參數(shù)),或者統(tǒng)一處理

Promise/A+規(guī)范

  • 一個(gè)Promise可能存在三種狀態(tài):等待(pending),已完成(fulfilled),已拒絕(rejected)
  • 一個(gè)Promise的狀態(tài)只可能從"等待"轉(zhuǎn)到"完成"或者"拒絕",不能逆向轉(zhuǎn)換
  • Promise必須實(shí)現(xiàn)then方法,(then是promise核心),而且then必須返回一個(gè)promise,同一個(gè)promise的then可以調(diào)用多次,并且回調(diào)執(zhí)行的順序和它們定義的順序一樣。
  • then方法接受兩個(gè)參數(shù),第一個(gè)參數(shù)是成功時(shí)候的回調(diào),另一個(gè)是失敗的回調(diào),then可以接受另一個(gè)promise傳入,也接受一個(gè)"類then"的對(duì)象或者方法,即thenable對(duì)象

標(biāo)準(zhǔn)的Promise

可參考html5rocks的這篇文章JavaScript Promises,目前高級(jí)瀏覽器如chrome、firefox都已經(jīng)內(nèi)置了Promise對(duì)象,提供更多的操作接口,比如Promise.all()
,支持傳入一個(gè)promises數(shù)組,當(dāng)所有promises都完成時(shí)執(zhí)行then,還有就是更加友好強(qiáng)大的異常捕獲,應(yīng)對(duì)日常的異步編程,應(yīng)該足夠了。

第三方庫(kù)的Promise

現(xiàn)今流行的各大js庫(kù),幾乎都不同程度的實(shí)現(xiàn)了Promise,如dojo,jQuery、Zepto、when.js、Q等,只是暴露出來(lái)的大都是Deferred
對(duì)象,

尾聲

我們看到,不管Promise實(shí)現(xiàn)怎么復(fù)雜,但是它的用法卻很簡(jiǎn)單,組織的代碼很清晰,從此不用再受callback的折磨了。
最后,Promise是如此的優(yōu)雅!但Promise也只是解決了回調(diào)的深層嵌套的問(wèn)題,真正簡(jiǎn)化JavaScript異步編程的還是Generator,在Node.js端,建議考慮Generator。

參考文獻(xiàn)

-alloyteam

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Promiese 簡(jiǎn)單說(shuō)就是一個(gè)容器,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果,語(yǔ)法上說(shuō),Pr...
    雨飛飛雨閱讀 3,492評(píng)論 0 19
  • 特點(diǎn) Promise能將回調(diào)分離出來(lái),在異步操作執(zhí)行之后,用鏈?zhǔn)椒椒▓?zhí)行回調(diào),雖然es5用封裝函數(shù)也能實(shí)現(xiàn),但是如...
    一二三kkxx閱讀 737評(píng)論 0 1
  • 你不知道JS:異步 第三章:Promises 在第二章,我們指出了采用回調(diào)來(lái)表達(dá)異步和管理并發(fā)時(shí)的兩種主要不足:缺...
    purple_force閱讀 2,258評(píng)論 0 4
  • 你不知道JS:異步 第三章:Promises 接上篇3-1 錯(cuò)誤處理(Error Handling) 在異步編程中...
    purple_force閱讀 1,500評(píng)論 0 2
  • 特別說(shuō)明,為便于查閱,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 960評(píng)論 0 2

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