2016-05-13 9 views
0

Betrachten Sie diese Code-Schnipsel, in dem eine Funktion b ein Versprechen bekommt und nennt sich, wenn es um aufgelöst wird ein weiteres Versprechen zu bekommen:leidet ein rekursives Versprechen Speicherverlust?

var a = function() { 
    var timeout = 1000; 

    let time_promise = new Promise((resolve, reject) => { 
     let success = false; 

     setTimeout(()=> { 
     document.getElementById('log').appendChild(document.createTextNode("Called ")); 
      resolve(); 
     }, timeout); 
     }); 

    return time_promise; 

}; 

var b = function() { 
    a().then(()=>{ 
     //is the first b() released after this call? 
     b(); 
    }); 
}; 

b(); 

code on jsfiddle

meine Frage ist: ist der erste Aufruf freigegeben b nachdem es sich selbst genannt hat? Beachten Sie, dass sich der Aufruf an sich selbst in einer Funktion befindet, die aufgerufen wird, wenn then aufgerufen werden muss.

+0

Es wird nach einem '()' Anruf freigegeben. https://jsfiddle.net/L62pjzq0/2/ –

+1

Anruflisten werden für geplante Funktionen nicht beibehalten. Vielleicht möchten Sie lesen https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop –

+1

Mögliche Duplikate von [Erstellen einer Versprechenskette rekursiv in Javascript - Speicher Überlegungen] (http://stackoverflow.com/) Fragen/29925948/Gebäude-ein-Versprechen-Kette-rekursiv-in-Javascript-Speicher-Überlegungen) –

Antwort

1

Es gibt keine Rekursion. b nennt sich nicht selbst. Der Rückruf ruft b auf und der Rückruf wird aufgerufen, nachdem b beendet wurde.

+0

Ich würde immer noch argumentieren, dass es immer noch Rekursion ist, konzeptionell. Eine Funktion muss sich nicht selbst als rekursiv bezeichnen (siehe gegenseitige Rekursion), noch muss sie mehr als einmal im Stack vorkommen (das ist ein Implementierungsdetail, siehe Optimierung von Tail Calls). Aber das könnte nur meine Meinung sein;) –