簡易promise的實現(一)


code

最近在思考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之后的值

請看下一章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM