// 簡易版本的promisepromise
// 第一步: 列出三大塊 this.then resolve/reject fn(resolve,reject) // 第二步: this.then負責註冊全部的函數 resolve/reject負責執行全部的函數 // 第三步: 在resolve/reject裏面要加上setTimeout 防止還沒進行then註冊 就直接執行resolve了 // 第四步: resolve/reject裏面要返回this 這樣就能夠鏈式調用了 // 第五步: 三個狀態的管理 pending fulfilled rejected // *****promise的鏈式調用 在then裏面return一個promise 這樣才能then裏面加上異步函數 // 加上了catch function PromiseM(fn) { var value = null; var callbacks = []; //加入狀態 爲了解決在Promise異步操做成功以後調用的then註冊的回調不會執行的問題 var state = 'pending'; var _this = this; //註冊全部的回調函數 this.then = function (fulfilled, rejected) { //若是想鏈式promise 那就要在這邊return一個new Promise return new PromiseM(function (resolv, rejec) { //異常處理 try { if (state == 'pending') { callbacks.push(fulfilled); //實現鏈式調用 return; } if (state == 'fulfilled') { var data = fulfilled(value); //爲了能讓兩個promise鏈接起來 resolv(data); return; } if (state == 'rejected') { var data = rejected(value); //爲了能讓兩個promise鏈接起來 resolv(data); return; } } catch (e) { _this.catch(e); } }); } //執行全部的回調函數 function resolve(valueNew) { value = valueNew; state = 'fulfilled'; execute(); } //執行全部的回調函數 function reject(valueNew) { value = valueNew; state = 'rejected'; execute(); } function execute() { //加入延時機制 防止promise裏面有同步函數 致使resolve先執行 then還沒註冊上函數 setTimeout(function () { callbacks.forEach(function (cb) { value = cb(value); }); }, 0); } this.catch = function (e) { console.log(JSON.stringify(e)); } //經典 實現異步回調 fn(resolve, reject); }