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 ?
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 ?
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.
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.
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(); }
``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.
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.