ES6的Promises是采用了Promises/A+提案的一種實(shí)現(xiàn)。你現(xiàn)在能夠找到的各種第三方實(shí)現(xiàn),如果是完全兼容了Promises/A+的,那么就和ES6的Promises是一致的(當(dāng)然了,第三方實(shí)現(xiàn)可能會(huì)增加更多的API,而ES6的實(shí)現(xiàn)只需要符合Promises/A+提案的最基本要求即可)。Promises是一種模式,它能夠讓異步操作變得看起來更像是同步的,無論是寫起來還是讀起來都會(huì)更愉悅更輕松一些。基本上它是把延續(xù)傳遞風(fēng)格(Continuation-passingstyle)的代碼,比如:doSomeAsync("url",function(err,results){//在延續(xù)傳遞的回調(diào)函數(shù)里處理err,或者處理results});變成返回值的形式:varpromise=doSomeAsync("url")這個(gè)返回的對(duì)象就是一個(gè)Promises對(duì)象,它代表著異步操作的結(jié)果:可能是成功的獲取到某些數(shù)據(jù),也可能是失敗返回的狀態(tài)和信息。在我們獲得Promises對(duì)象的那一刻我們并無法知道具體是什么,但是只要異步操作完成,Promises對(duì)象必然會(huì)有一個(gè)確定狀態(tài)(所以才叫Promises,也就是“許諾,承諾”)。我們甚至不需要去查詢這個(gè)狀態(tài),只需要告訴它要做什么就可以了。貌似延續(xù)傳遞的毀掉函數(shù)也能做到上述這些?沒錯(cuò)。但是Promises的意義就在于它把未來的結(jié)果作為一個(gè)對(duì)象返回給你,你可以用同步的方式來寫代碼處理它,比如說作為參數(shù)傳遞,比如說聚合多個(gè)Promises操作等等。解決異步嵌套并非Promises的目的,而是使用Promises后得到的一個(gè)副作用——當(dāng)然是好的副作用。Promises真正的意義在于集中化處理異常。什么意思呢?考慮一下同步函數(shù),它的特點(diǎn)是要么返回值,要么拋出異常。返回的值可以繼續(xù)傳遞給別的函數(shù)做進(jìn)一步處理,而異常則可以在調(diào)用棧的某一層被捕獲并處理。我們總認(rèn)為異步回調(diào)的問題在于嵌套過深,然而嵌套只是表象,真正的難點(diǎn)在于你無法讓異步回調(diào)統(tǒng)一處理返回值或異常,所以才不得不嵌套起來。Promises把異步操作的結(jié)果變成對(duì)象返回出來并可以進(jìn)一步處理,這就好像同步函數(shù)的經(jīng)典行為,于是才可能有這樣的異步處理:varpromise=doSomeAsync("url");promise.then(doOneThingAsync).then(doAnotherThingAsync).then(doFinalThing).catch(dealWithAnyErrors);鏈?zhǔn)秸{(diào)用的最后一個(gè).catch,它可以處理前面三步中拋出的任意異常,這才是Promises的精髓:把異步操作同步化,因而不用嵌套回調(diào)函數(shù)并且能夠集中處理異常。補(bǔ)充一點(diǎn),jQuery里實(shí)現(xiàn)的Promises是有問題的(和Promises/A+比較),而且問題比較嚴(yán)重。如果你希望使用Promises的習(xí)慣以及相關(guān)的API符合未來的ES6,那么請(qǐng)不要視jQuery的實(shí)現(xiàn)或行為是“正確的”,甚至根據(jù)jQuery核心成員的描述,這些問題將永遠(yuǎn)得不到解決(在jQuery中,出于向后兼容的考慮)。