最近在思考promise的實現原理
於是准備自己寫一個簡單的demo
一開始想到的問題有兩個
1.鏈式調用
2.異步順序執行
-------------------------------------------------
我們先聲明一個異步操作的函數 來模擬異步請求
function http(url){ return new MyPromise(function(resolve,reject){ setTimeout(function(){ resolve(url); },1000) }) }
下面就開始寫一個簡單的promise
有 then,resolve,reject方法
1.then里面會有一個回調方法,我們用callback存起來
2.then回調之后可能會 return,我們用 res保存 callback的返回值,丟到下一個then的resolve中,作為參數。
3.注意,有時候我們沒寫then方法,所以沒有回調。這個時候就要判斷了,不需要執行回調
function MyPromise(fn) { var res = null, callback = null; function resolve(val) { if(typeof(callback) === 'function'){ res = callback(val); } } function reject(val){ if(typeof(callback) === 'function'){ res = callback(val); } } this.then = function (cb) { callback = cb; return new MyPromise(function(resolve,reject){ setTimeout(() => { resolve(res); }, 3000); }) }; fn(resolve,reject); }
現在我們調用一下
http('www.123.com').then(function(res){ console.log(res) return 123132; }).then(function(res){ console.log(res) })
輸出
和我們預期的一樣,第一個 then里面的參數也傳到第二個then方法中了
但是這樣也有很多問題
1.第一個異步時間是1000ms,then方法里面的異步時間是 3000ms
加入第二個請求比第一個快,那個 前面的return 后面接收不到。結果輸出undefiend
2.如果第一個 return一個異步請求,那么 第二個then收到的是一個promise對象,而不是 promise resolve之后的值
請看下一章