wake-up-neo.com

Ist Node.js Array.map () asynchron?

Kann ich mit nodeIDs rechnen, wird die Zuordnung jedes Mal abgeschlossen, wenn doSomething () aufgerufen wird?

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

Ich dachte, alle Rückrufe in node.js wären asynchron? Ich habe einen Artikel zur allgemeinen Programmierung gelesen, dass Callback synchron sein könnte, aber ich bin mir nicht sicher über node.js? 

23
bonchef

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 wird durch MDN Array.prototype.map () dokumentiert und durch ECMAScript 5.1 angegeben.

Um Ihre Frage zu beantworten: Ja, doSomething(nodeIDs) heißt after 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. Ich würde sagen, dass setTimeout() keine Funktion höherer Ordnung ist, selbst wenn sie eine Funktion als Parameter verwendet, da setTimeout() nicht wirklich rein funktional ist, da sie Zeit verwendet. Reine Funktionalität ist zeitlos. Beispielsweise hängt das Ergebnis von map() nicht von der Zeit ab. Und darum geht es in dieser Frage wirklich. Wenn etwas nicht von der Zeit abhängt, führen Sie es synchron aus. Problem gelöst.

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

40
nalply

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

14
user1479055

importieren Sie das async-Modul, um eine asynchrone 'map'-Methode zu erhalten

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);
}
3
Damien Romito

benutze ein forof (ist synchron):

let arr = ['fizz', 'buzz']
//example
    for (const item of arr) {
   //this Examp_func returns array
     console.log((await Examp_func(item )).length);
    }
0

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

Alle Rückrufe, die möglicherweise länger dauern (hauptsächlich aufgrund von E/A), sind in nodejs asynchron - es sei denn, die Methode ist explizit als synchron gekennzeichnet (z. B. fs.readFileSync - jedoch ohne Rückruf). Du hast das wahrscheinlich irgendwie verwirrt.

0
ThiefMaster