Tentativo di implementazione promise Javascript di base

Per capire meglio come funzionano le promesse in Javascript ho deciso di provarlo e di implementare il codice di base da solo.

Fondamentalmente voglio implementare Promises Object (lo chiamo Aaa nel mio codice) che funziona come argomento. Questa funzione può chiamare risolvere per resolve la promise o rifiutarla per reject . L’implementazione di base e l’utilizzo sono sotto. Non sono sicuro che il secondo argomento sia accettabile secondo le specifiche di promise, ma è quello che ho ottenuto finora.

 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"); }); 

Quindi ora la promise può essere creata, chiamata e risolta. Ogni metodo restituirà quindi nuovo Aaa (Promise) in modo che questi possano essere concatenati. Ora il codice qui sotto utilizza la promise creata sopra e le catene, then callback. Ognuno then restituisce nuova promise e in questo caso sembra funzionare bene:

 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); }); 

l’output che sto ottenendo è:

 ggg aaa bbb ggg ggg fff ccc good ddd undefined 

Il problema è comunque quando una delle chiamate then restituisce una promise:

 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); }); 

L’output è:

 ggg aaa bbb ggg ggg fff ccc good ggg iii jjj ggg ddd undefined kkk lll good2 

La chiamata quindi dove output ddd non deve essere chiamata UNTIL la promise restituita appena aggiunta è stata risolta.

Come sarebbe meglio implementarlo?