2011-01-01 13 views
1

Vor allem ... Frohes neues Jahr!Funktionen in Serie ausführen

Könnten Sie mir bitte erklären, wie das funktioniert? Ich durchforstete Verbinden 's (https://github.com/senchalabs/connect) Quellcode, aber ich verstehe es nicht.

Ich möchte es selbst schreiben.

app.get(
    '/', 
    function(req, res, next) { 
    // Set variable   
    req.var = 'Happy new year!'; 
    // Go to next function 
    next(); 
    }, 
    function(req, res, next) { 
    // Returns 'Happy new year!' 
    console.log(req.var); // <- HOW IS THIS POSSIBLE? 
    // (...) 
    }  
); 

Vielen Dank im Voraus!

Antwort

1

Es scheint, als ob das erste von Ihnen angegebene Funktionsargument zuerst von der get()-Funktion aufgerufen wird.

Wenn es aufgerufen wird, werden 3 Parameter für den Anruf bereitgestellt. Innerhalb des Aufrufs muss der Parameter req ein Objekt sein, dem Sie Eigenschaften zuweisen können. Sie haben die Eigenschaft var zugewiesen und einen Wert von 'Happy new year!' angegeben.

Das nächste übergebene Funktionsargument wird über einen Aufruf des Parameters next() aufgerufen, und dem Aufruf werden erneut 3 Parameter übergeben. Der erste Parameter ist offensichtlich das gleiche Objekt, das dem ersten Aufruf zugewiesen wurde, dem Sie die var-Eigenschaft zugewiesen haben.

Weil es (anscheinend) das gleiche Objekt ist, ist die Eigenschaft, die Sie zugewiesen haben, noch vorhanden.

Hier ist ein einfaches Beispiel: http://jsfiddle.net/dWfRv/1/(öffnen Sie Ihre Konsole)

// The main get() function. It has two function parameters. 
function get(fn1, fn2) { 
     // create an empty object that is passed as argument to both functions. 
    var obj = {}; 
     // create a function that is passed to the first function, 
     // which calls the second, passing it the "obj". 
    var nxt = function() { 
     fn2(obj); //When the first function calls this function, it fires the second. 
    }; 
     // Call the first function, passing the "obj" and "nxt" as arguments. 
    fn1(obj, nxt); 
} 

// Call get(), giving it two functions as parameters 
get(
    function(req, next) { 
     // the first function sets the req argument (which was the "obj" that was passed). 
    req.msg = 'Happy new year'; 
     // the second function calls the next argument (which was the "nxt" function passed). 
    next(); 
    }, 
    function(req) { 
    // The second function was called by the first via "nxt", 
    // and was given the same object as the first function as the first parameter, 
    // so it still has the "msg" that you set on it. 
    console.log(req.msg); 
    } 
); 

Beachten Sie, dass dies ein sehr vereinfachtes Beispiel ist, mit weniger Parameter in den Funktionen. Nicht auch, dass ich var zu msg geändert habe, da var ein reserviertes Wort ist.

+1

Vielen Dank, Patrick. – Latanmos

+0

@Latanmos: Gern geschehen. – user113716

+0

@Patrick Und was, wenn wir mehr Funktionen haben? Wie 'get ([fn1, fn2, fn3, ...]);'? – Latanmos

1

Wenn Sie möchten, versuchen Sie es mit dem Async-Modul. Es macht es viel einfacher, in Serie zu laufen, parallel zu laufen oder einen Pool zu benutzen.

https://github.com/caolan/async

Verwandte Themen