Основная попытка реализации обещания Javascript

Чтобы лучше понять, как работают обещания в Javascript, я решил сам попробовать и написать базовую реализацию.

По сути, я хочу реализовать объект Promises (я называю это Aaa в моем коде), который принимает функцию в качестве аргумента. Эта функция может вызвать разрешениеresolve обещание или отклонитьreject Это. Основная реализация и использование ниже. Не уверен, что второй аргумент приемлем в соответствии со спецификациями обещаний, но это то, что я получил до сих пор.

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 

Проблема, однако, когда один изthen звонки возвращают обещание:

aaa.then(function(res) {

    console.log("ccc");
    console.log(res);

    // here we return the promise manually. then next then call where "ddd" is output should not be called UNTIL this promise is resolved. How to do that?

        return new Aaa(function(resolve,reject) {

        console.log("iii");

        setTimeout(function() {
        console.log("kkk");
            resolve("good2");
            // reject("bad");

        },2000);

        console.log("jjj");

    }).then(function (res) {
        console.log("lll");

        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  
ggg  
iii  
jjj  
ggg  
ddd  
undefined  
kkk  
lll  
good2 

Звонок тогда кудаddd is output не должен вызываться, пока возвращаемое обещание, которое мы только что добавили, разрешено.

Как это будет лучше всего реализовано?

Ответы на вопрос(4)

Ваш ответ на вопрос