Kann ich mich darauf verlassen, dass die Zuordnung der Knoten-IDs bei jedem Aufruf von doSomething () abgeschlossen ist?

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 die allgemeine Programmierung gelesen, wonach Rückruf synchron sein könnte, bin mir aber bei node.js nicht sicher?

29
bonchef 7 Okt. 2012 im 00:32

6 Antworten

Beste Antwort

JavaScript ist auch eine funktionale Programmiersprache. Was Sie hier haben, ist eine Funktion höherer Ordnung, eine Funktion, die eine Funktion als Parameter verwendet. 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 an und wendet sie auf alle Elemente eines Arrays an. Die Definition klingt sehr «funktional». Diese Funktion wird auch von Node nicht bereitgestellt. Es wird von MDN Array.prototype.map () und angegeben durch ECMAScript 5.1.

So beantworten Sie Ihre Frage: Ja, doSomething(nodeIDs) wird aufgerufen, nachdem alle Elemente angewendet wurden.


Hinweis: setTimeout() setTimeout() map()

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

47
nalply 12 Aug. 2016 im 08:46

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 ausdrücklich als synchron markiert (z. B. fs.readFileSync -, aber es wird kein Rückruf verwendet). Sie haben das wahrscheinlich irgendwie verwirrt.

1
ThiefMaster 6 Okt. 2012 im 20:33

Importieren Sie das Modul async mit einer asynchronen Methode 'map'

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
suda 8 Jän. 2018 im 20:11

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

16
user1479055user1479055 6 Okt. 2012 im 20:33

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
Roberto A. Batty 7 Juni 2019 im 19:10

Es wartet eine nützliche Bibliothek auf. Und map wird Ihnen helfen.

-1
Ivan Nosov 17 Juli 2017 im 12:52