2012-10-06 11 views
21

Kann ich mit NodeIDs rechnen? Das Mapping wird jedes Mal abgeschlossen, wenn doSomething() aufgerufen wird?Ist Node.js Array.map() asynchron?

nodeIDs = $.map(nodeIDs, function(n){ 
    return n.match(/\d+$/); 
}); 
doSomething(nodeIDs); 

Ich dachte, alle Rückrufe in node.js sind asynchron? Ich habe einen Artikel über allgemeine Programmierung gelesen, der Callback könnte synchron sein, aber ich bin mir nicht sicher über node.js?

+0

Was ist $ hier? map verwendet eine Rückruffunktion, die auf jedes Mitglied der Liste angewendet wird, und keine Rückruffunktion, wenn die vollständige Iteration abgeschlossen ist. – chovy

+0

Danke Chovy.Was das $ betrifft, habe ich gerade mit dem Node-Jquery-Modul experimentiert und bin nicht daran gegangen, das zu bearbeiten. – bonchef

Antwort

32

JavaScript ist auch eine funktionale Programmiersprache. Was Sie hier haben, ist eine «Funktion höherer Ordnung», eine Funktion, die eine Funktion als Parameter übernimmt. Funktionen höherer Ordnung sind synchron (siehe Hinweis unten).

Quellen:

map() ist ein typisches Beispiel für eine Funktion höherer Ordnung. Es nimmt eine Funktion und wendet sie auf alle Elemente eines Arrays an. Die Definition klingt sehr "funktional". Diese Funktion wird auch nicht von Node bereitgestellt. Es ist dokumentiert durch MDN Array.prototype.map() und spezifiziert durch ECMAScript 5.1.

Um Ihre Frage zu beantworten: Ja, doSomething(nodeIDs) heißt nach alle Elemente wurden angewendet.


Hinweis: Die Funktion höherer Ordnung ist ein Konzept der funktionalen Programmierung. JavaScript ist funktional, aber auch tief in der praktischen Ausführung von Code in einem Browser oder auf dem Server verankert. Ich würde sagen, dass zum Beispiel setTimeout() keine Funktion höherer Ordnung ist, auch wenn es eine Funktion als Parameter braucht, weil setTimeout() nicht wirklich rein funktional ist, weil es Zeit verwendet. Pure Funktionalität ist zeitlos. Zum Beispiel hängt das Ergebnis von map() nicht von der Zeit ab. Und genau darum geht es in dieser Frage. Wenn etwas nicht von der Zeit abhängt, führen Sie es synchron aus. Problem gelöst.

Dank Simon für die Herausforderung der Definition der Funktion höherer Ordnung in JavaScript.

+0

Danke nalply. Ein Blick auf die Referenzimplementierung von map() hilft. – bonchef

+0

* Funktionen höherer Ordnung sind synchron * - wirklich? setTimeout ist auch eine Funktion höherer Ordnung, aber es ist asynchron. –

+0

@ SimonA.Eugster Du hast einen Punkt. Wenn Sie Funktionen definieren, die Funktionen als Parameter höherer Ordnung verwenden, dann sind asynchrone Funktionen auch "höhere Ordnung". Was würden Sie synchrone Funktionen nennen, die Funktionen als Parameter annehmen? – nalply

0

Diese Funktion ist synchron - andernfalls konnte das Ergebnis der Kartenoperation nicht zurückgegeben werden.

Alle Callbacks, die (vor allem aufgrund von IO) länger dauern können, sind in Nodejs asynchron - es sei denn, die Methode wird explizit als synchron gekennzeichnet (z. B. fs.readFileSync -, verwendet jedoch keinen Rückruf). Das hast du wahrscheinlich irgendwie verwirrt.

+0

Danke ThiefMaster. Ich verstehe den Teil der Sync- und Async-Versionen der IO-Funktionen und habe beides in der Vergangenheit genutzt. Um meine Frage besser zu formulieren: Bei einem Codeabschnitt kann ich, wenn keine Rückrufe vorhanden sind, von einem synchronen Ablauf ausgehen. Aber wenn es Rückrufe gibt, gibt es keinen offensichtlichen Weg, das eine oder das andere zu bestätigen? Wenn IOs beteiligt sind, sind sie wahrscheinlich asynchron. Aber im Fall map() war ich nicht so sicher - weder nodejs noch die Javascript-Referenzen scheinen das zu spezifizieren. Wie kann ich für die nächste Bibliotheksfunktion, die ich treffe, sagen? – bonchef

+0

Die Dokumente geben es an. Z.B. http://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback "asynchrone Umbenennung" – ThiefMaster

11

Ja, .map ist synchron. "Rückruf" bedeutet nicht "asynchron".

+1

Danke Charmander. Ich wollte damit sagen, dass im Zweifelsfall angenommen wird, dass Callbacks asynchron zu einem anderen Zeitpunkt aufgerufen werden können. Also die eigentliche Frage ist (siehe meine Kommentare oben) - Allgemein wie kann ich feststellen, ob eine bestimmte Bibliotheksfunktion asynchron ist oder nicht? – bonchef

+0

Die node.js Dateifunktionen zum Beispiel sind gut dokumentiert, aber andere, wie z. B. Array-Mapping Ich kann nicht scheinen, diese bestimmte Information zu finden. – bonchef

+0

Das liegt daran, dass sie nicht von Node bereitgestellt werden. Sie gehören zur V8-Laufzeit. V8 implementiert ECMAScript. 'Array.map()' ist hier dokumentiert: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map. – nalply

3

importieren das async Modul ein asynchrones haben 'map' Methode

var async = require('async'); 

var arr = ['1','2']; 
async.map(arr, getInfo, function (e, r) { 
    console.log(r); 
}); 

function getInfo(name, callback) { 
    setTimeout(function() { 
    callback(null, name + 'new'); 
    }, 1000); 
} 
-1

Es ist nützlich, lib awaiting. Und map wird Ihnen helfen.