回調函數真正的問題在於他剝奪了我們使用 return 和 throw 這些關鍵字的能力。而 Promise 很好地解決了這一切。
所謂 Promise,就是一個對象,用來傳遞異步操作的消息。它代表了某個未來纔會知道結果的事件(通常是一個異步操作),並且這個事件提供統一的 API,可供進一步處理。
他有三個狀態,Pending(進行中)、Resolved(已完成)和 Rejected(已失敗)。Promise 對象的狀態改變,只有兩種可能:從 Pending 變爲 Resolved 和從 Pending 變爲 Rejected。
- 它可以避免層層回調函數的繁瑣,每次都是返回一個promise對象,可採用和jq一樣的鏈式調用;
- 出錯由catch error處理;
- 操作內部也可以通過rejected和resolved;
- then方法裏返回promise,執行結果作爲下一個then參數。
Promise 構造函數接受一個函數作爲參數,該函數的兩個參數分別是 resolve 方法和 reject 方法。
如果異步操作成功,則用 resolve 方法將 Promise 對象的狀態,從「未完成」變爲「成功」(即從 pending 變爲 resolved);
如果異步操作失敗,則用 reject 方法將 Promise 對象的狀態,從「未完成」變爲「失敗」(即從 pending 變爲 rejected)。
層層嵌套回調函數:
a(function(v1){
b(v1,function(v2){
c(v2,function(v3){
//等等。。
})
}
}
promise:代碼就會優雅不少。
a().then(b).then(c).catch(function(e){...})
主要參考:1. http://www.jianshu.com/p/063f7e490e9a
2. 阮一峯的ES6