2016-07-02 8 views
0

Ich lese irgendwo, dass, wenn eine Funktion aufgerufen wird, der Compiler alle sichtbaren Variablen auf einen Stack legt, etwas mit Closures, jetzt mit dem folgenden Code bin ich nicht wirklich sicher, ob es ' d arbeiten in einer gleichzeitigen Umgebung wie node.js.Callstack Variablen in Javascript

Product.prototype.list = function(body) { 
    body.options = { 
     hostname: endPoints.product, 
     path: '/applications/' + body.entityType 
     method: 'GET' 
    }; 
    return remote.request(body) 
     .then(function(result){ 
      body[body.entityType] = result; 
      return body; 
     }); 
}; 

Wenn nun die folgenden beiden Funktionen gleichzeitig mit Versprechungen aufgerufen werden, kommt es zu einem Abschluss? Zum Beispiel

product.list({entityType: "coke"}) 
    .then(console.log); //will this have {coke: []} or {pepsi: []} 

product.list({entityType: "pepsi"}) 
    .then(console.log); 
+0

Ich denke, das hängt davon ab, was "Produkt" ist? – adeneo

Antwort

1

Ja eine Schließung wird durch die anonyme Funktion, die Sie then passieren erstellt werden. Die Variable, die geschlossen wird, ist der body Wert, der an die äußere list Funktion übergeben wird.

Jedes Mal, wenn Sie list aufrufen - im obigen Beispiel haben Sie es zweimal aufgerufen - fügen Sie dem Objekt body einige Werte hinzu, instanziieren dann einen neuen Abschluss und stellen diesen Wert für ihn zur Verfügung. Die Werte, die Sie an jeden Anruf von list übergeben, sind beide Objektliterale, was bedeutet, dass sie vollständig getrennt sind und Sie unterschiedliche Werte an die Schließung weitergeben werden, so dass der Anruf, der "coke" beinhaltet, niemals eine Verbindung zu haben wird der Anruf mit "Pepsi".

+0

für weitere Informationen über die Zeit der Schließungs-Erstellung, ist diese Schließung erstellt, wenn die Funktion 'list' aufgerufen wird oder wenn' .then' aufgerufen wird? – user2727195

+0

@ user2727195 - Der Abschluss wird erstellt, wenn die 'list()' Funktion aufgerufen wird, da die freie Variable 'body' in diesem Bereich übergeben, definiert und gespeichert wird, was auch in der' remote.request() .dann (... 'Funktion, weil es lexikalisch ist. – adeneo