2016-04-10 19 views
0

Ich bin neu bei node.js. Ich erforsche bereits, wie ich meinen Code außerhalb von node.js Threadschleife (Ereignisschleife) auf Google ausführen kann, aber die Antwort nicht bekommen kann.Laufender Code außerhalb von node.js Thread-Schleife

Wie kann ich eine Funktion erstellen, die außerhalb Knoten Ereignisschleife ausgeführt wird. beispielsweise in mungo, verwenden sie

scheme.save(function(err)){ 
    console.log('saved'); 
}); 

Daten eingefügt werden, wobei der Knoten das Insert Code ausgeführt (Speicherfunktion) außerhalb Ereignisschleife und dann zurück zu Ereignisschleife meinen Rückruf auszuführen (in dem obigen Beispiel, tut etwas Protokollierung).

i versuchen

function getUser(id, callback) { 
    setTimeout(function() { 
     console.log('executed'); 
     callback(null, "jhon"); 
    }, 5000); 
    } 

    function display(err,user) { 
     console.log(user); 
    } 

    getUser(432, display); 
    console.log('this show first'); 

aber es synchron laufen (es die Ereignisschleife für 5 Sekunden blockieren, bevor neue Anforderung behandelt wird).

Wie kann ich die gleiche "Speichern" -Funktion implementieren, so dass es keine Ereignisschleife für 5 Sekunden im obigen Code blockiert? ein Thema zu lesen? danke.

+0

Warum denken Sie, es blockiert die Ereignisschleife? –

+0

Bitte lesen Sie die aktualisierte Frage. Ich versuche, Code auf 2 getrennte Registerkarte oben auszuführen. und das zweite Protokoll "Diese Show zuerst" wird protokolliert, nachdem das erste "Jhon" -Log erschienen ist. mache ich es falsch? "Show erste" "jhon" "Show erste" "jhon" statt 'Show erste Show erste john john' – gitong0315

+0

es so etwas wie drucken falsch. @shershen Antwort ist richtig. – gitong0315

Antwort

0

Wie @SteveCampbell sagte - Sie irren sich, wenn Sie davon ausgehen, dass setTimeout(function() { /// }, 5000) BLOCK der Ereignisschleife - es wird nicht. Es wird verzögert nur die Ausführung des Codes innerhalb der Funktion für 5 Sekunden.

Während diese 5 Sekunden dauern, ist die NodeJS-Engine voll funktionsfähig und kann andere Aktionen ausführen, Netzwerkanforderungen empfangen und senden und andere E/A durchführen.

enter image description here überprüft auf diesen Ressourcen auf der NodeJS Ereignisschleife Art und Weise, um ein korrekten Gebrauch zu machen:

UPD

"Code wie Holen von RSS-Daten" - ist wieder nur Erstellen einer Aufgabe und Hinzufügen eines Rückrufs, der ausgeführt wird, wenn die Aufgabe erledigt ist. Es blockiert nichts, das ist die coolste Idee hinter dem Async-Code von NodeJS. prüfen example rss reader in NodeJS:

//1 - task configuration 
var req = request('http://somefeedurl.xml') 
    , feedparser = new FeedParser([options]); 

// here while rss is being retrieved in a separate sub task 
// nodejs engine can do other tasks 

//2- callback for error 
req.on('error', function (error) { 
    // handle any request errors 
}); 
//2- callback for response with data 
req.on('response', function (res) { 
//... 
+0

Bitte lesen Sie die aktualisierte Frage. Ich versuche, über Code auf 2 getrennten Tab zu laufen. und das zweite Protokoll "Diese Show zuerst" wird protokolliert, nachdem das erste "Jhon" -Log erschienen ist. \t es so etwas wie: "diese Show zuerst" "jhon" "diese Show zuerst" "jhon" statt "diese Show zuerst" "diese Show zuerst" "John" "John" – gitong0315

+0

was ist, wenn in der GetUser-Funktion iam einige lang laufenden Code wie das Abrufen von RSS-Daten tun? Wird es seine Ereignisschleife blockieren oder automatisch einen neuen Prozess für mich erstellen? das ist die eigentliche Frage. settimeout ist nur mein Ansatz, um lange laufenden Code zu simulieren – gitong0315

+0

Überprüfen Sie die aktualisierte Antwort – shershen