Promise

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這樣的邏輯。
  • 另外一個缺點就是静汤,假設我們的三次保存之間并沒有前后依賴關系琅催,我們仍然需要等待前面的函數(shù)執(zhí)行完畢, 才能執(zhí)行下一步,而無法三個保存并行虫给,之后返回一個三個保存過后需要的結果藤抡。(或者說實現(xiàn)起來需要技巧)
ES6 Promise

Promise對象狀態(tài)
它三個狀態(tài):

  • pending(執(zhí)行中)

  • fulfilled(成功)

  • reject(拒絕)
    狀態(tài)轉換關系為:

     pending->fulfilled,pending->rejected抹估。
    

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ù)中瓤漏,對錯誤進行處理腾夯。

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

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í)行回調。

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

    promise.catch(function(err){
        // deal the err.
    })
    
控制并發(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值.

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

轉載淺談ES6原生Promise

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市敬鬓,隨后出現(xiàn)的幾起案子淹朋,更是在濱河造成了極大的恐慌,老刑警劉巖钉答,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑞你,死亡現(xiàn)場離奇詭異,居然都是意外死亡希痴,警方通過查閱死者的電腦和手機者甲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砌创,“玉大人虏缸,你說我怎么就攤上這事∧凼担” “怎么了刽辙?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甲献。 經(jīng)常有香客問我宰缤,道長,這世上最難降的妖魔是什么晃洒? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任慨灭,我火速辦了婚禮,結果婚禮上球及,老公的妹妹穿的比我還像新娘氧骤。我一直安慰自己,他們只是感情好吃引,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布筹陵。 她就那樣靜靜地躺著刽锤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朦佩。 梳的紋絲不亂的頭發(fā)上并思,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音纺荧,去河邊找鬼颅筋。 笑死,一個胖子當著我的面吹牛占贫,可吹牛的內容都是我干的先口。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼厢汹,長吁一口氣:“原來是場噩夢啊……” “哼谐宙!你這毒婦竟也來了?” 一聲冷哼從身側響起搭综,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤划栓,失蹤者是張志新(化名)和其女友劉穎忠荞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體委煤,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡素标,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了头遭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡袜香,死狀恐怖鲫惶,靈堂內的尸體忽然破棺而出蜈首,到底是詐尸還是另有隱情欠母,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布踩寇,位于F島的核電站六水,受9級特大地震影響,放射性物質發(fā)生泄漏掷贾。R本人自食惡果不足惜想帅,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憎乙。 院中可真熱鬧叉趣,春花似錦、人聲如沸阵谚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冀痕,卻和暖如春狸演,著一層夾襖步出監(jiān)牢的瞬間僻他,已是汗流浹背宵距。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吨拗,地道東北人满哪。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓劝篷,卻偏偏與公主長得像哨鸭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子娇妓,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內容