猿问

基本Javascript承诺实现尝试

为了更好地理解Promise如何在Javascript中工作,我决定自己尝试一下并编写基本的实现。


基本上,我想实现以函数为参数的Promises对象(在我的代码中称为Aaa)。此函数可以调用resolve对承诺的解决,也可以拒绝reject。基本实现和用法如下。不知道第二个参数是否可以按照promise规范接受,但这就是我到目前为止所得到的。


Aaa=function(f,pause) { 


    console.log("ggg");


    var t=this;

    this.f=f;

    this.thens=[];


    this.resolve=function(g) {


        for(var i=0;i<t.thens.length;i++)

        {

            // try/catch to be used later for dealing with exceptions


            try

            {

                t.thens[i].f(g);

                t.thens[i].resolve();

            }   

            catch(ex)

            {}


        }

    };  


    // to be implemented later

    this.reject=function(g) {};


    this.then=function(resolve,reject) {


        // i'm passing true for pause argument as we dont need to execute promise code just yet

        var nextPromise=new Aaa(resolve,true);


        this.thens.push(nextPromise);


        return nextPromise;

    }



    if(!pause)

        this.f(this.resolve,this.reject); 


}



var aaa=new Aaa(function(resolve,reject) {


    console.log("aaa");


    setTimeout(function() {


        console.log("fff");

        resolve("good");


    },2000);


    console.log("bbb");


});

因此,现在可以创建,调用和解决承诺。每个then方法将返回新的Aaa(承诺),因此可以将它们链接在一起。现在,下面的代码使用上面创建的promise并链接then回调。每个then返回新的诺言,在这种情况下,它似乎可以正常工作:


aaa.then(function(res) {


    console.log("ccc");

    console.log(res);


})

.then(function(res) {

    console.log("ddd");

    console.log(res);

},function(rej) {

    console.log("eee");

    console.log(rej);

});

我得到的输出是:


ggg

aaa 

bbb 

ggg 

ggg 

fff 

ccc 

good 

ddd 

undefined 

如何最好地实施?



肥皂起泡泡
浏览 414回答 3
3回答
随时随地看视频慕课网APP

相关分类

Java
我要回答