Promise 是異步編程的一種解決方案,Promise 能夠認爲是一個對象,從它能夠獲取異步操做的消息。Promise 提供統一的 API,各類異步操做均可以用一樣的方法進行處理。具備兩大特色:編程
ES6 規定,Promise對象是一個構造函數,用來生成Promise實例。json
new Promise( /* executor */ function(resolve, reject) {...} );
Promise構造函數接受一個函數做爲參數,該函數的兩個參數分別是resolve和reject。它們是兩個函數,由 JavaScript 引擎提供,不用本身部署。看一個實例:promise
let promise = new Promise(function(resolve, reject) { console.log('Promise'); resolve(); }); promise.then(function() { console.log('resolved.'); }); console.log('Hi!'); // Promise // Hi! // resolved
能夠看到,在new promise的時候,會當即執行promise構造函數中的參數function,也就是包含resolve、reject兩個方法的函數會被當即執行,上面代碼中,Promise 新建後當即執行,因此首先輸出的是Promise。而後,then方法指定的回調函數,將在當前腳本全部同步任務執行完纔會執行,因此resolved最後輸出。
注意:
1. promise的參數函數中若是resolve、reject這兩個函數中的某個帶了參數也是 promise的話,那麼這個本來的promise的狀態將會由參數中的promise的狀態決定
2. resolve、reject並不會想return同樣結束函數的運行異步
then方法是定義在原型對象Promise.prototype上的。它的做用是爲 Promise 實例添加狀態改變時的回調函數。then方法的第一個參數是resolved狀態的回調函數,第二個參數(可選)是rejected狀態的回調函數。then方法返回的是一個新的Promise實例(注意,不是原來那個Promise實例)。所以能夠採用鏈式寫法,即then方法後面再調用另外一個then方法。異步編程
// getJSON 是一個promise實例 getJSON("/posts.json").then(function(json) { return json.post; }).then(function(post) { // ... });
不少時候在then中會人爲的書寫一些異步操做,這樣能夠很好的鏈式調用,可是即便不是人爲的異步操做,JavaScript也會自動的把then的返回值封裝爲promise實例,能夠一直使用then無限回調。函數
Promise.prototype.catch方法是.then(null, rejection)的別名,用於指定發生錯誤時的回調函數。若是異步操做拋出錯誤,狀態就會變爲rejected,就會調用catch方法指定的回調函數,處理這個錯誤。另外,then方法指定的回調函數,若是運行中拋出錯誤,也會被catch方法捕獲。post
//getJSON 是一個promise getJSON('/posts.json').then(function(posts) { // ... }).catch(function(error) { // 處理 getJSON 和 前一個回調函數運行時發生的錯誤 console.log('發生錯誤!', error); });
比較推薦的書寫方法是先使用then來給promise添加resolve的回調,而後使用catch來捕獲全部的連接上的reject或者異常。prototype
能夠說Promise.resolve是惟一的把promise轉換爲完成狀態的操做,Promise.resolve方法的參數分紅四種狀況:code
Promise.reject(reason)方法也會返回一個新的 Promise 實例,該實例的狀態爲rejected。
注意,Promise.reject()方法的參數,會原封不動地做爲reject的理由,變成後續方法的參數。這一點與Promise.resolve方法不一致。對象