web-dev-qa-db-fra.com

Node.js Array.map () est-il asynchrone?

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? 

23
bonchef

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.


Remarque: La fonction d'ordre supérieur est un concept de programmation fonctionnelle. JavaScript est fonctionnel, mais il est également profondément ancré dans le côté pratique de l'exécution de code dans un navigateur ou sur le serveur. Je dirais que, par exemple, 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.

40
nalply

Oui, .map est synchrone. "Rappel" n'implique pas "asynchrone".

14
user1479055

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

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.

0
ThiefMaster