Puis-je compter sur le fait que le mappage des ID de nœud est terminé chaque fois que doSomething () est appelé?
nodeIDs = $.map(nodeIDs, function(n){
return n.match(/\d+$/);
});
doSomething(nodeIDs);
Je pensais que tous les rappels dans node.js sont asynchrones? J'ai lu un article sur la programmation générale indiquant que le rappel pourrait être synchrone, mais je ne suis pas sûr de node.js?
JavaScript est également un langage de programmation fonctionnel. Vous avez ici une «fonction d'ordre supérieur», une fonction qui prend une fonction en tant que paramètre. Les fonctions d'ordre supérieur sont synchrones (mais voir la note ci-dessous).
Sources:
map()
est un exemple typique d'une fonction d'ordre supérieur. Il prend une fonction et l'applique à tous les éléments d'un tableau. La définition semble très «fonctionnelle». Cette fonction n'est pas non plus fournie par Node. Il est documenté par MDN Array.prototype.map () et spécifié par ECMAScript 5.1 .
Pour répondre à votre question: Oui, doSomething(nodeIDs)
est appelé après tous les éléments ont été appliqués.
setTimeout()
n'est pas une fonction d'ordre supérieur même si elle prend une fonction en tant que paramètre car setTimeout()
n'est pas vraiment purement fonctionnel car il utilise le temps. La fonctionnalité pure est intemporelle. Par exemple, le résultat de map()
ne dépend pas du temps. Et c'est ce que cette question est vraiment. Si quelque chose ne dépend pas du temps, vous l'exécutez de manière synchrone. Problème résolu.Merci à Simon pour avoir contesté la définition de la fonction d'ordre supérieur en JavaScript.
Oui, .map
est synchrone. "Rappel" n'implique pas "asynchrone".
importer le module async
pour avoir une méthode 'map
' asynchrone
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);
}
Cette fonction est synchrone - sinon, elle ne pourrait pas renvoyer le résultat de l'opération de carte.
Tous les rappels pouvant durer plus longtemps (principalement en raison d'IO) sont asynchrones dans nodejs - à moins que la méthode ne soit explicitement marquée comme étant synchrone (telle que fs.readFileSync
- mais sans rappel). Vous avez probablement confondu cela en quelque sorte.