淺析Javascript ES6中的原生Promise__第1頁(yè)
淺析Javascript ES6中的原生Promise__第2頁(yè)
淺析Javascript ES6中的原生Promise__第3頁(yè)
淺析Javascript ES6中的原生Promise__第4頁(yè)
淺析Javascript ES6中的原生Promise__第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、淺析Javascript ES6中的原生Promise_ 前言 一個(gè) Promise 對(duì)象可以理解為一次將要執(zhí)行的操作(經(jīng)常被用于異步操作),用法了 Promise 對(duì)象之后可以用一種鏈?zhǔn)秸{(diào)用的方式來(lái)組織代碼,讓代碼更加直觀。而且由于 Promise.all 這樣的方法存在,可以讓同時(shí)執(zhí)行多個(gè)操作變得簡(jiǎn)潔。 Promise的興起,是由于異步方法調(diào)用中,往往會(huì)消失回調(diào)函數(shù)一環(huán)扣一環(huán)的狀況。這種狀況導(dǎo)致了回調(diào)金字塔問(wèn)題的消失。不僅代碼寫(xiě)起來(lái)費(fèi)勁又不美觀,而且問(wèn)題簡(jiǎn)單的時(shí)候,閱讀代碼的人也難以理解。 舉例如下: db.save(data, function(data) / do something.

2、 db.save(data1, function(data) / do something. db.save(data2, function(data) / do something. done(data3); / 返回?cái)?shù)據(jù) ) ); ); 假設(shè)有一個(gè)數(shù)據(jù)庫(kù)保存操作,一次懇求需要在三個(gè)表中保存三次數(shù)據(jù)。那么我們的代碼就跟上面的代碼相像了。這時(shí)候假設(shè)在其次個(gè)db.save出了問(wèn)題怎么辦?基于這個(gè)考慮,我們又需要在每一層回調(diào)中用法類(lèi)似try.catch這樣的規(guī)律。這個(gè)就是萬(wàn)惡的來(lái)源,也是node剛開(kāi)頭廣為詬病的一點(diǎn)。 另外一個(gè)缺點(diǎn)就是,假設(shè)我們的三次保存之間并沒(méi)有前后依靠關(guān)系,我們?nèi)耘f需要等待前面

3、的函數(shù)執(zhí)行完畢, 才能執(zhí)行下一步,而無(wú)法三個(gè)保存并行,之后返回一個(gè)三個(gè)保存過(guò)后需要的結(jié)果。(或者說(shuō)實(shí)現(xiàn)起來(lái)需要技巧) 不幸的是,在我剛開(kāi)頭接觸node的時(shí)候,我寫(xiě)了大量這樣的hell。 后來(lái)由于還是寫(xiě)前端代碼多一些,我接觸了ES6,發(fā)覺(jué)了一個(gè)解決回調(diào)深淵的利器Promise。 其實(shí)早在ES6的Promise之前,Q,when.js,bluebird等等庫(kù)早就依據(jù)Promise標(biāo)準(zhǔn)(參考Promise/A+)造出了自己的promise輪子。 (看過(guò)一篇文章,我覺(jué)得很有道理。里面說(shuō),不要擴(kuò)展內(nèi)置的原生對(duì)象。這種做法是不能面對(duì)將來(lái)的。所以這里有一個(gè)提示:用法擴(kuò)展原生Promise的庫(kù)時(shí),需要謹(jǐn)慎。)

4、 這里僅商量原生的Promise。 ES6 Promise Promise對(duì)象狀態(tài) 在詳解Promise之前,先來(lái)點(diǎn)理論: Promise/A+規(guī)范, 規(guī)定Promise對(duì)象是一個(gè)有限狀態(tài)機(jī)。 它三個(gè)狀態(tài): 1、pending(執(zhí)行中) 2、fulfilled(勝利) 3、reject(拒絕) 其中pending為初始狀態(tài),fulfilled和rejected為結(jié)束狀態(tài)(結(jié)束狀態(tài)表示promise的生命周期已結(jié)束)。 狀態(tài)轉(zhuǎn)換關(guān)系為: pending-fulfilled,pending-rejected。 隨著狀態(tài)的轉(zhuǎn)換將觸發(fā)各種大事(如執(zhí)行勝利大事、執(zhí)行失敗大事等)。 Promise形式 P

5、romise的長(zhǎng)相就像這樣子: var promise = new Promise(function func(resolve, reject) / do somthing, maybe async if (success) return resolve(data); else return reject(data); ); promise.then(function(data) / do something. e.g console.log(data); , function(err) / deal the err. ) 這里的變量promise是Promise這個(gè)對(duì)象的實(shí)例。 promis

6、e對(duì)象在創(chuàng)建的時(shí)候會(huì)執(zhí)行func函數(shù)中的規(guī)律。 規(guī)律處理完畢并且沒(méi)有錯(cuò)誤時(shí),resolve這個(gè)回調(diào)會(huì)將值傳遞到一個(gè)特別的地方。這個(gè)特別的地方在哪呢?就是下面代碼中的then,我們用法then中的回調(diào)函數(shù)來(lái)處理resolve后的結(jié)果。比如上面的代碼中,我們將值簡(jiǎn)潔的輸出到掌握臺(tái)。假如有錯(cuò)誤,則reject到then的其次個(gè)回調(diào)函數(shù)中,對(duì)錯(cuò)誤進(jìn)行處理。 配合上面的有限狀態(tài)機(jī)的理論,我們知道在Promise構(gòu)造函數(shù)中執(zhí)行回調(diào)函數(shù)代碼時(shí),狀態(tài)為pending,resolve之后狀態(tài)為fulfilled,reject之后狀態(tài)為reject Promise數(shù)據(jù)流淌 以上是promise的第一次數(shù)據(jù)流淌狀況

7、。 比較funny的是,promise的then方法依舊能夠返回一個(gè)Promise對(duì)象,這樣我們就又能用下一個(gè)then來(lái)做一樣的處理。 第一個(gè)then中的兩個(gè)回調(diào)函數(shù)決定第一個(gè)then返回的是一個(gè)什么樣的Promise對(duì)象。 假設(shè)第一個(gè)then的第一個(gè)回調(diào)沒(méi)有返回一個(gè)Promise對(duì)象,那么其次個(gè)then的調(diào)用者還是原來(lái)的Promise對(duì)象,只不過(guò)其resolve的值變成了第一個(gè)then中第一個(gè)回調(diào)函數(shù)的返回值。 假設(shè)第一個(gè)then的第一個(gè)回調(diào)函數(shù)返回了一個(gè)Promise對(duì)象,那么其次個(gè)then的調(diào)用者變成了這個(gè)新的Promise對(duì)象,其次個(gè)then等待這個(gè)新的Promise對(duì)象resolve

8、或者reject之后執(zhí)行回調(diào)。 話雖然饒了一點(diǎn),但是我自我感覺(jué)說(shuō)的還是很清晰的呢。哈哈 假如任意地方遇到了錯(cuò)誤,則錯(cuò)誤之后交給遇到的第一個(gè)帶其次個(gè)回調(diào)函數(shù)的then的其次個(gè)回調(diào)函數(shù)來(lái)處理??梢岳斫鉃殄e(cuò)誤始終向后reject, 直到被處理為止。 另外,Promise對(duì)象還有一個(gè)方法catch,這個(gè)方法接受一個(gè)回調(diào)函數(shù)來(lái)處理錯(cuò)誤。 即: promise.catch(function(err) / deal the err. ) 假設(shè)對(duì)錯(cuò)誤的處理是相像的,這個(gè)方法可以對(duì)錯(cuò)誤進(jìn)行集中統(tǒng)一處理。所以其他的then方法就不需要其次個(gè)回調(diào)啦 掌握并發(fā)的Promise Promise有一個(gè)靜態(tài)方法Promis

9、e.all(留意并非是totype), 這個(gè)方法接受一個(gè)元素是Promise對(duì)象的數(shù)組。 這個(gè)方法也返回一個(gè)Promise對(duì)象,假如數(shù)組中全部的Promise對(duì)象都resolve了,那么這些resolve的值將作為一個(gè)數(shù)組作為Promise.all這個(gè)方法的返回值的(Promise對(duì)象)的resolve值,之后可以被then方法處理。假如數(shù)組中任意的Promise被reject,那么該reject的值就是Promise.all方法的返回值的reject值. 很op的一點(diǎn)是: then方法的第一個(gè)回調(diào)函數(shù)接收的resolve值(如上所述,是一個(gè)數(shù)組)的挨次和Promise.

10、all中參數(shù)數(shù)組的挨次全都,而不是按時(shí)間挨次排序。 還有一個(gè)和Promise.all相類(lèi)似的方法Promise.race,它同樣接收一個(gè)數(shù)組,只不過(guò)它只接受第一個(gè)被resolve的值。 將其他對(duì)象變?yōu)镻romise對(duì)象 Promise.resovle方法,可以將不是Promise對(duì)象作為參數(shù),返回一個(gè)Promise對(duì)象。 有兩種情形: 假設(shè)傳入的參數(shù)沒(méi)有一個(gè).then方法,那么這個(gè)返回的Promise對(duì)象變成了resolve狀態(tài),其resolve的值就是這個(gè)對(duì)象本身。 假設(shè)傳入的參數(shù)帶有一個(gè)then方法(稱(chēng)為thenable對(duì)象), 那么將這個(gè)對(duì)象的類(lèi)型變?yōu)镻romise,其then方法變成Ptotype.then方法。 Promise是解決異步的方案嗎? 最終說(shuō)一點(diǎn)很重要的事:Promise的作用是解決回調(diào)金字塔的問(wèn)題,對(duì)于掌握異步流程事實(shí)上沒(méi)有起到很大的作用。真正用法Promise對(duì)異步流程

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論