437 votes

JavaScript, NodeJS : est Array.forEach asynchrone ?

J’ai une question au sujet de l’indigène `` mise en œuvre de Javascript : doit-il se comporter de façon asynchrone ? Par exemple, si je donne la parole :

Est-ce que cela sera non bloquante ?

439voto

Felix Kling Points 247451

Non, c'est le blocage. Jetez un oeil à la spécification de l'algorithme.

Cependant peut-être plus facile de comprendre la mise en œuvre est donné sur MDC:

if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun /*, thisp */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in t)
        fun.call(thisp, t[i], i, t);
    }
  };
}

Si vous devez exécuter un beaucoup de code pour chaque élément, vous devriez envisager d'utiliser une approche différente:

function processArray(items, process) {
    var todo = items.concat();

    setTimeout(function() {
        process(todo.shift());
        if(todo.length > 0) {
            setTimeout(arguments.callee, 25);
        }
    }, 25);
}

et puis l'appeler avec:

processArray([many many elements], function () {lots of work to do});

Ce serait non bloquant alors. L'exemple pris est de Haute Performance JavaScript.

Une autre option pourrait être des web workers.

84voto

Caolan Points 1736

Si vous avez besoin d’une version asynchrone d’Array.forEach et similaires, ils sont disponibles dans le module « async » de Node.js : http://github.com/caolan/async .. .comme un bonus ce module fonctionne également dans le navigateur.

18voto

Dave Dopson Points 16690

Il y a un modèle commun pour vraiment faire un lourd calcul du Nœud qui peuvent être applicables pour vous...

Le nœud est monothread (comme une volonté délibérée de choix de conception, voir qu'est-Ce que node.js?); cela signifie qu'il ne peut utiliser qu'un seul cœur. Moderne, ont les boîtes de 8, 16 ou même plus de cœurs, ce qui pourrait laisser plus de 90% de l'ordinateur est en veille. Le modèle commun pour un service REST est de tirer jusqu'à un nœud processus par cœur, et de mettre ces derrière un local d'équilibrage de la charge comme http://nginx.org/.

Bifurquer un enfant - Pour ce que vous êtes en train de faire, il y a un autre modèle commun, bifurquer d'un enfant de faire le levage lourd. L'avantage est que le processus de l'enfant peut faire lourd calcul en arrière-plan pendant que votre processus parent est sensible à d'autres événements. Le hic, c'est que vous ne pouvez pas / ne devrait pas partager de la mémoire avec cet enfant, de processus (et non sans BEAUCOUP de contorsions et du code natif); vous devez passer des messages. Cela fonctionne à merveille si la taille de votre entrée et de sortie de données est faible par rapport au calcul doit être effectué. Vous pouvez même mettre le feu à un enfant node.js processus et utiliser le même code que vous utilisiez auparavant.

Par exemple:

var child_process = require('child_process');
fonction run_in_child(tableau, cb) {
 var processus = child_process.exec('node libfn.js', function(err, stdout, stderr) {
 var output = JSON.parse(stdout);
 cb(err, output);
});
 processus.stdin.écrire(JSON.stringify(array), 'utf8');
processus.stdin.fin();
}

7voto

Tobu Points 10101

``est destiné pour le calcul des choses sans attendre, et il n’y a rien à gagner en calculs asynchrones dans une boucle d’événements (webworkers multitraitement, ajouter, si vous avez besoin de calcul multi-core). Si vous voulez attendre pour mettre fin à des tâches multiples, utilisez un compteur, qui vous pouvez encapsuler dans une classe de sémaphore.

1voto

Rax Wunter Points 23

Il s’agit d’une fonction asynchrone courte à utiliser sans nécessiter de tierce partie libs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X