就像談到閉包必需要說js變量做用域同樣,談到 promise 以前確定要先說談異步編程。一直以來, javascript 處理異步方式都是使用 callback 方式,對與寫 javascript 的人來時候 callback 深刻人心。好比只有前端經驗沒有後端經驗的同窗看到 java 代碼可能會問『爲何readFile方法能夠直接返回結果?爲什麼不使用 callback 』javascript
因爲 javascript 的單線程性質,必須等待上一個事件執行完成才能處理下一步。傳統解決 javascript 異步編程的方法就是使用 callback,好比這樣:html
$(document).ready(function(){ ajaxGet('/api/userinfo', function() { ajaxGet('/api/productList', function() { ajaxGet('/api/ads', function(result) { console.log('all done!'); }); }); }); });
再好比這樣:前端
截止到2015年10月20日晚,http://www.kuaidadi.com/assets/js/animate.js還能夠訪問。html5
『快的』用線上代碼爲咱們生動的演示了什麼叫callback hell
——『回調地獄』。java
Promise 字面上能夠理解爲『承諾』,即A調用B,B返回一個『承諾』給A,而後A就能夠認爲B給我返回結果的時候我就執行方案一了,反之沒有獲得結果就執行方案二。jquery
上面這句話翻譯爲代碼:git
var resB = B(); var runA = function() { resB.then(execPlan1, execPlan2); } runA();
Promise 是一種異步操做模式,表示一個異步操做的最終結果,返回的是一個 Promise 對象,因爲是當即返回,因此能夠採用同步操做的流程。 這個 Promise 對象有一個 then 方法,容許指定回調函數,在異步任務完成後調用。es6
好比上面『快的』的例子能夠改寫爲這樣:github
(new Promise(step1)) .then(step2) .then(step3) .then(step4) .then(step5) .then(step6) .then(step7) .then(step8) .then(step9) .then(step10) .then(step11) .then(step12) .then(step13) .then(step14) .then(step15) .then(step16) .then(step17);
看,『橫向的胖子』變的苗條了,看起來是否是更加可愛呢?ajax
Promise有個一個規範叫作 Promises/A+, 有各類各樣的第三方庫遵循這個規範實現了 Promise/A+ 。 好比 Q、 when, jQuery 有個相似的方法叫 Deferred。
一個 Promise 對象的實例通常有三種狀態:未完成(pending)、已完成(fulfilled)和失敗(rejected)。
這三種的狀態的變化途徑只有兩個,且只能發生一次:從「未完成」到「已完成」,或者從「未完成」到「失敗」。
一旦當前狀態變爲「已完成」或「失敗」,就意味着不會再發生狀態變化了。
Promise對象的運行結果,最終只有兩種。
獲得一個值,狀態變爲fulfilled
拋出一個錯誤,狀態變爲rejected
JavaScript Promise啓示錄
JavaScript Promise迷你書(中文版)
JavaScript Promises
javascript.ruanyifeng.com
Promise/A+規範
本文首發於 http://fy98.com/2015/10/20/from-callback-hell-to-promise/