參考連接:
手寫一個本身的Promise(1)
https://www.jianshu.com/p/c63...
https://juejin.im/post/5b5c24...
一塊兒學習造輪子(一):從零開始寫一個符合Promises/A+規範的promise編程
Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。json
Promise對象是一個構造函數,用來生成Promise實例。數組
const promise = new Promise(function(resolve, reject) { // ... some code if (/* 異步操做成功 */){ resolve(value); } else { reject(error); } });
Promise實例生成之後,能夠用then方法分別指定resolved狀態和rejected狀態的回調函數。promise
promise.then(function(value) { // success }, function(error) { // failure });
Promise 新建後就會當即執行。
調用resolve或reject並不會終結 Promise 的參數函數的執行。異步
new Promise((resolve, reject) => { resolve(1); console.log(2); }).then(r => { console.log(r); }); // 2 // 1
Promise 對象的錯誤具備「冒泡」性質,會一直向後傳遞,直到被捕獲爲止。也就是說,錯誤老是會被下一個catch語句捕獲。
getJSON('/post/1.json').then(function(post) { return getJSON(post.commentURL); }).then(function(comments) { // some code }).catch(function(error) { //
finally方法用於指定無論 Promise 對象最後狀態如何,都會執行的操做。異步編程
Promise.all方法用於將多個 Promise 實例,包裝成一個新的 Promise 實例。函數
const p = Promise.all([p1, p2, p3]);
p的狀態由p一、p二、p3決定,分紅兩種狀況。oop
Promise.race方法一樣是將多個 Promise 實例,包裝成一個新的 Promise 實例。post
const p = Promise.race([p1, p2, p3]);
上面代碼中,只要p一、p二、p3之中有一個實例率先改變狀態,p的狀態就跟着改變。那個率先改變的 Promise 實例的返回值,就傳遞給p的回調函數。學習
有時須要將現有對象轉爲 Promise 對象,Promise.resolve方法就起到這個做用。
Promise.resolve等價於下面的寫法。 Promise.resolve('foo') // 等價於 new Promise(resolve => resolve('foo'))
當即resolve的 Promise 對象,是在本輪「事件循環」(event loop)的結束時,而不是在下一輪「事件循環」的開始時。
setTimeout(function () { console.log('three'); }, 0); Promise.resolve().then(function () { console.log('two'); }); console.log('one'); // one // two // three
Promise.reject(reason)方法也會返回一個新的 Promise 實例,該實例的狀態爲rejected。