中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

淺析Javascript ES6中的原生Promise
來源:易賢網(wǎng) 閱讀:1644 次 日期:2016-08-30 14:27:25
溫馨提示:易賢網(wǎng)小編為您整理了“淺析Javascript ES6中的原生Promise”,方便廣大網(wǎng)友查閱!

前言

一個 Promise 對象可以理解為一次將要執(zhí)行的操作(常常被用于異步操作),使用了 Promise 對象之后可以用一種鏈式調用的方式來組織代碼,讓代碼更加直觀。而且由于 Promise.all 這樣的方法存在,可以讓同時執(zhí)行多個操作變得簡單。

Promise的興起,是因為異步方法調用中,往往會出現(xiàn)回調函數(shù)一環(huán)扣一環(huán)的情況。這種情況導致了回調金字塔問題的出現(xiàn)。不僅代碼寫起來費勁又不美觀,而且問題復雜的時候,閱讀代碼的人也難以理解。 

舉例如下:

db.save(data, function(data){

 // do something...

 db.save(data1, function(data){

 // do something...

 db.save(data2, function(data){

  // do something...

  done(data3); // 返回數(shù)據(jù)

 })

 });

});

假設有一個數(shù)據(jù)庫保存操作,一次請求需要在三個表中保存三次數(shù)據(jù)。那么我們的代碼就跟上面的代碼相似了。這時候假設在第二個db.save出了問題怎么辦?基于這個考慮,我們又需要在每一層回調中使用類似try...catch這樣的邏輯。這個就是萬惡的來源,也是node剛開始廣為詬病的一點。

另外一個缺點就是,假設我們的三次保存之間并沒有前后依賴關系,我們仍然需要等待前面的函數(shù)執(zhí)行完畢, 才能執(zhí)行下一步,而無法三個保存并行,之后返回一個三個保存過后需要的結果。(或者說實現(xiàn)起來需要技巧)

不幸的是,在我剛開始接觸node的時候,我寫了大量這樣的hell。

后來因為還是寫前端代碼多一些,我接觸了ES6,發(fā)現(xiàn)了一個解決回調深淵的利器Promise。

其實早在ES6的Promise之前,Q,when.js,bluebird等等庫早就根據(jù)Promise標準(參考Promise/A+)造出了自己的promise輪子。 

(看過一篇文章,我覺得很有道理。里面說,不要擴展內置的原生對象。這種做法是不能面向未來的。所以這里有一個提示:使用擴展原生Promise的庫時,需要謹慎。)

這里僅討論原生的Promise。

ES6 Promise

Promise對象狀態(tài)

在詳解Promise之前,先來點理論:

Promise/A+規(guī)范, 規(guī)定Promise對象是一個有限狀態(tài)機。

它三個狀態(tài):

1、pending(執(zhí)行中)

2、fulfilled(成功)

3、reject(拒絕)

其中pending為初始狀態(tài),fulfilled和rejected為結束狀態(tài)(結束狀態(tài)表示promise的生命周期已結束)。

狀態(tài)轉換關系為:

pending->fulfilled,pending->rejected。

隨著狀態(tài)的轉換將觸發(fā)各種事件(如執(zhí)行成功事件、執(zhí)行失敗事件等)。

Promise形式

Promise的長相就像這樣子:

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這個對象的實例。

promise對象在創(chuàng)建的時候會執(zhí)行func函數(shù)中的邏輯。

邏輯處理完畢并且沒有錯誤時,resolve這個回調會將值傳遞到一個特殊的地方。這個特殊的地方在哪呢?就是下面代碼中的then,我們使用then中的回調函數(shù)來處理resolve后的結果。比如上面的代碼中,我們將值簡單的輸出到控制臺。如果有錯誤,則reject到then的第二個回調函數(shù)中,對錯誤進行處理。

配合上面的有限狀態(tài)機的理論,我們知道在Promise構造函數(shù)中執(zhí)行回調函數(shù)代碼時,狀態(tài)為pending,resolve之后狀態(tài)為fulfilled,reject之后狀態(tài)為reject

Promise數(shù)據(jù)流動

以上是promise的第一次數(shù)據(jù)流動情況。

比較funny的是,promise的then方法依然能夠返回一個Promise對象,這樣我們就又能用下一個then來做一樣的處理。

第一個then中的兩個回調函數(shù)決定第一個then返回的是一個什么樣的Promise對象。

假設第一個then的第一個回調沒有返回一個Promise對象,那么第二個then的調用者還是原來的Promise對象,只不過其resolve的值變成了第一個then中第一個回調函數(shù)的返回值。

假設第一個then的第一個回調函數(shù)返回了一個Promise對象,那么第二個then的調用者變成了這個新的Promise對象,第二個then等待這個新的Promise對象resolve或者reject之后執(zhí)行回調。

話雖然饒了一點,但是我自我感覺說的還是很清楚的呢。哈哈~

如果任意地方遇到了錯誤,則錯誤之后交給遇到的第一個帶第二個回調函數(shù)的then的第二個回調函數(shù)來處理。可以理解為錯誤一直向后reject, 直到被處理為止。

另外,Promise對象還有一個方法catch,這個方法接受一個回調函數(shù)來處理錯誤。

即:

promise.catch(function(err){

 // deal the err.

})

假設對錯誤的處理是相似的,這個方法可以對錯誤進行集中統(tǒng)一處理。所以其他的then方法就不需要第二個回調啦~

控制并發(fā)的Promise

Promise有一個"靜態(tài)方法"——Promise.all(注意并非是promise.prototype), 這個方法接受一個元素是Promise對象的數(shù)組。

這個方法也返回一個Promise對象,如果數(shù)組中所有的Promise對象都resolve了,那么這些resolve的值將作為一個數(shù)組作為Promise.all這個方法的返回值的(Promise對象)的resolve值,之后可以被then方法處理。如果數(shù)組中任意的Promise被reject,那么該reject的值就是Promise.all方法的返回值的reject值.

很op的一點是: 

then方法的第一個回調函數(shù)接收的resolve值(如上所述,是一個數(shù)組)的順序和Promise.all中參數(shù)數(shù)組的順序一致,而不是按時間順序排序。

還有一個和Promise.all相類似的方法Promise.race,它同樣接收一個數(shù)組,只不過它只接受第一個被resolve的值。

將其他對象變?yōu)镻romise對象

Promise.resovle方法,可以將不是Promise對象作為參數(shù),返回一個Promise對象。

有兩種情形:

假設傳入的參數(shù)沒有一個.then方法,那么這個返回的Promise對象變成了resolve狀態(tài),其resolve的值就是這個對象本身。

假設傳入的參數(shù)帶有一個then方法(稱為thenable對象), 那么將這個對象的類型變?yōu)镻romise,其then方法變成Promise.prototype.then方法。

Promise是解決異步的方案嗎?

最后說一點很重要的事:Promise的作用是解決回調金字塔的問題,對于控制異步流程實際上沒有起到很大的作用。真正使用Promise對異步流程進行控制,我們還要借助ES6 generator函數(shù)。(例如Tj大神的co庫的實現(xiàn))。

然而ES7將有一個更加牛逼的解決方案:async/await,這個方案類似于co,但是加了原生支持。拭目以待吧。

總結

以上就是關于Javascript ES6中原生Promise的全部內容了,希望本文的內容對大家學習ES6能有所幫助

更多信息請查看網(wǎng)絡編程
易賢網(wǎng)手機網(wǎng)站地址:淺析Javascript ES6中的原生Promise

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網(wǎng)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲一区在线看| 国产精品亚发布| 国产精品你懂的| 在线一区日本视频| 国产精品入口尤物| 亚洲综合三区| 欧美久久久久久久久| 国产视频一区二区三区在线观看| 亚洲第一精品福利| 国产欧美精品xxxx另类| 欧美日韩在线播放一区| 亚洲免费在线观看| 国产自产高清不卡| 欧美连裤袜在线视频| 亚洲尤物视频在线| 国产视频一区二区在线观看 | 老司机成人网| 日韩视频免费大全中文字幕| 国产精品久久久999| 久久久999精品免费| 一区二区三区成人| 国产在线一区二区三区四区| 欧美α欧美αv大片| 亚洲影院免费| 亚洲欧洲另类国产综合| 国产目拍亚洲精品99久久精品 | 久久精品国产一区二区三区| 亚洲激情另类| 国产欧美日韩亚洲一区二区三区| 欧美h视频在线| 亚洲曰本av电影| 亚洲国产精品电影| 国产欧美一区视频| 欧美日韩国产一区精品一区| 欧美亚洲免费高清在线观看| 日韩亚洲国产欧美| 亚洲电影免费观看高清完整版在线观看 | 欧美在线网址| 日韩视频在线观看免费| 国产午夜精品久久久| 欧美日韩一区二区三区免费| 久久婷婷国产麻豆91天堂| 亚洲精品乱码久久久久久按摩观| 欧美α欧美αv大片| 香蕉久久夜色| 亚洲永久免费av| 野花国产精品入口| 亚洲国产女人aaa毛片在线| 国产九九视频一区二区三区| 欧美精品1区| 美女诱惑一区| 久久婷婷丁香| 久久免费视频这里只有精品| 亚洲免费在线视频一区 二区| 91久久香蕉国产日韩欧美9色| 国产自产在线视频一区| 欧美日韩国产一中文字不卡| 亚洲精品一二区| 欧美成人亚洲成人| 久久免费黄色| 久久先锋影音av| 快播亚洲色图| 免费观看成人鲁鲁鲁鲁鲁视频| 久久精品二区| 久久久欧美一区二区| 久久精视频免费在线久久完整在线看| 午夜精品一区二区三区电影天堂| 亚洲一区3d动漫同人无遮挡| 亚洲午夜女主播在线直播| 日韩亚洲综合在线| 一区二区电影免费观看| 日韩一二三区视频| 一区二区免费看| 亚洲欧美国产日韩中文字幕| 亚洲欧美日韩综合aⅴ视频| 亚洲欧美日本日韩| 欧美一区二区高清| 久久综合伊人77777尤物| 男人的天堂亚洲| 欧美韩日亚洲| 欧美视频一区在线| 国产欧美日韩综合一区在线播放| 国产精品午夜电影| 今天的高清视频免费播放成人| 在线欧美一区| 亚洲精品在线观看视频| 亚洲一区二区3| 久久久99国产精品免费| 欧美mv日韩mv亚洲| 国产精品成人免费精品自在线观看| 国产精品wwwwww| 国产视频精品网| 亚洲精品视频在线看| 亚洲午夜精品国产| 久久精品日产第一区二区| 麻豆成人综合网| 国产精品盗摄久久久| 在线播放豆国产99亚洲| 一本色道久久综合亚洲91| 欧美一区二区三区免费观看| 你懂的网址国产 欧美| 欧美性猛交一区二区三区精品| 国产日韩三区| 夜夜嗨av一区二区三区免费区 | 好看的亚洲午夜视频在线| 亚洲国产精品一区二区第四页av| 一本色道久久综合亚洲精品不卡| 午夜一区二区三区不卡视频| 免播放器亚洲一区| 国产欧美日韩在线| 亚洲精品系列| 久久天天躁狠狠躁夜夜av| 国产精品久久久久aaaa九色| 在线精品福利| 午夜视频在线观看一区二区三区| 欧美寡妇偷汉性猛交| 国产一区亚洲一区| 亚洲免费伊人电影在线观看av| 欧美+日本+国产+在线a∨观看| 国产欧美日韩视频一区二区三区| 亚洲区一区二区三区| 久久久久国产一区二区| 久久久久网址| 国产欧美精品在线播放| 一区二区三区久久网| 欧美国内亚洲| 最近中文字幕mv在线一区二区三区四区| 欧美一区二区在线观看| 国产精品乱码妇女bbbb| 99re6这里只有精品视频在线观看| 久久久xxx| 国产一区二区高清| 亚洲欧美在线aaa| 国产精品久久久99| 亚洲视频精品在线| 欧美日韩亚洲一区| 亚洲精品一线二线三线无人区| 久久久伊人欧美| 国内外成人在线视频| 久久成人在线| 国内自拍一区| 久久久视频精品| 伊人成人开心激情综合网| 久久精品人人做人人综合| 国产日韩欧美高清| 翔田千里一区二区| 国产专区欧美专区| 麻豆精品视频在线| 亚洲三级网站| 欧美视频精品在线| 亚洲视频一区二区| 国产精品日韩在线观看| 午夜精品久久久99热福利| 国产亚洲欧美日韩一区二区| 欧美综合第一页| 在线观看欧美视频| 欧美成人国产va精品日本一级| 亚洲韩国青草视频| 亚洲欧美日韩综合一区| 国产欧美日韩91| 一区二区三区回区在观看免费视频| 欧美精品一区视频| 亚洲自拍偷拍麻豆| 精品999日本| 亚洲视频在线免费观看| 国产欧美三级| 欧美电影电视剧在线观看| 亚洲视频免费| 国产一区二区三区丝袜| 欧美成人午夜激情| 亚洲一区二区三区视频| 黄色成人在线观看| 欧美另类极品videosbest最新版本| 亚洲午夜久久久| 亚洲二区在线观看| 国产精品久久久久久久久久直播| 性欧美激情精品| 亚洲精华国产欧美| 国产日韩亚洲| 欧美日韩一区二区高清| 久久aⅴ国产紧身牛仔裤| 最近中文字幕日韩精品| 欧美三级在线视频| 老司机67194精品线观看| 亚洲视频自拍偷拍| 亚洲国产欧美精品| 国产欧美日本一区二区三区| 欧美精品午夜| 久久精品一区蜜桃臀影院| 在线中文字幕不卡| 亚洲精品1区| 黄色日韩网站视频| 国产毛片精品国产一区二区三区| 欧美国产成人精品| 久久综合电影一区| 欧美一区二区三区在线视频 | 欧美视频一区二区| 久久在线精品| 久久精品国产欧美激情| 亚洲女性裸体视频|