Я не совсем уверен, что я понимаю, что вам нужно, но я считаю, что то, что вам нужно, это создать вызовы функций, что означает, что вам, вероятно, нужно запустить потенциально вычислительно интенсивный код и вы не хотите, чтобы он блокировал выполнение другого кода во время выполнения этого вычисления. Node.js обычно используется в однопоточном процессе, что означает, что в данный момент может работать только один кусок кода, но есть еще некоторые способы сделать это.
Один из способов сделать это, как указано в @ T.J. Ответ Кроудера заключается в том, чтобы поставить вызов вашей функции с помощью process.nextTick, чтобы он работал в следующем цикле цикла событий. Это может помочь разбить интенсивное вычисление на итерации и что каждая итерация будет поставлена в очередь для запуска в следующем цикле цикла событий после последнего. Это может помочь в некоторых случаях, но не всегда вы можете разбивать вычисления на итерации, которые запускают асинхронный переход друг от друга. Если вы ищете более подробное объяснение того, как Javascript работает асинхронно, я предлагаю прочитать this book.
Есть как минимум два других способа (что я знаю) для достижения своего рода параллелизма с Node.js - Рабочие/потоки и дочерние процессы. Редкие процессы - это еще один процесс Node.js, который выполняется вашим основным приложением. Вы можете использовать собственный модуль * child_process * для Node.js для запуска и управления дочерними процессами, если вы хотите пройти этот путь. Посмотрите на official docs для получения дополнительной информации.
Третий способ сделать это - использовать Рабочих очень похоже на то, как веб-работники используются в браузере. Рабочий - это фрагмент кода, который выполняется в другом потоке ОС, чем основное приложение. Мне кажется, что это самый простой способ добиться параллелизма, хотя некоторые утверждают, что это не самый надежный способ сделать это, и что создание дочерних процессов лучше.
Там очень хорошее объяснение того, как работают работники на MDN. Чтобы использовать Рабочих в Node.js, вам понадобится внешний модуль, такой как webworker-threads.
Вот пример кода, созданный из вашего образца с фрагментом из их документации:
var Worker = require('webworker-threads').Worker;
var worker = new Worker(function(){
onmessage = function(event) {
result = sum(event.data.a, event.data.b);
result = sum(result, event.data.c);
result = sum(result, event.data.d);
result = sum(result, event.data.e);
result = sum(result, event.data.f);
postMessage(result);
self.close();
};
});
worker.onmessage = function(event) {
console.log("The result is: " + event.data);
};
worker.postMessage({a: 1, b: 2, c: 3, d: 4, e: 5, f: 6});
// Do some other stuff that will happen while your Worker runs...
С учетом всего сказанного, большинство людей стараются избегать запуска параллельного кода в Node.js. Асинхронный характер Javascript позволяет легко писать простой и сжатый код, и обычно вы хотите сохранить его таким образом, не пытаясь ввести параллелизм в ваше приложение, если это не является абсолютно необходимым.
Вы, кажется, не понимаете обратные вызовы и асинхронное программирование. У вас нет ничего асинхронного в вашем коде. –
Я вижу, что это помечено node.js, поэтому я укажу вам на этот поток: http://stackoverflow.com/questions/5786016/how-do-i-make-this-js-function-asynchronous, который обращается к некоторым , если не большинство, ваши вопросы. –
Этот код не анализируется (вы используете выражение функции, где ожидается имя аргумента в обеих определяемых вами параметрах внешнего уровня, и есть некорректные совпадения с параметрами paren/brace). –