最近在思考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之后的值
請看下一章
