кодесурса
«node.js

Модель программирования Node.js

script1adsense2code
script1adsense3code

Вступление

В течение многих лет многие разработчики пытались повторно внедрить JavaScript в качестве языка на стороне сервера. На JSConf 2009 Райан Даль представил Node.js, язык на стороне сервера, основанный на v8. С тех пор он показал экспоненциальное распространение среди разработчиков. В этом уроке мы обсудим фундаментальные программные конструкции, за которыми следует язык.

JavaScript и Node по расширению являются однопоточными, а Node использует неблокирующий ввод-вывод и асинхронную модель, управляемую событиями. Никогда не блокировка ввода / вывода означает меньшее количество потоков. Он очень похож на Event Machine в Ruby или Twisted в Python, но Node представляет цикл обработки событий как языковую конструкцию, а не как библиотеку. В этом уроке мы обсудили две важные модели программирования - асинхронную модель и обратные вызовы. Позже мы обсудим еще одну базовую модель Event-emitters

Асинхронная модель

Давайте обсудим асинхронную модель с простым вариантом использования. Вы, наверное, видели, как реклама (или аналогичный контент третьих сторон), загружаемый на веб-страницу, иногда вызывает большую задержку. Если они загружаются асинхронно, они не будут блокировать загрузку других компонентов веб-страницы (например, содержимого). Это улучшит пользовательский опыт и оптимизирует использование полосы пропускания, особенно для мобильных пользователей, которые в настоящее время составляют большую часть интернет-зрителей.

Узел неблокирующий, что означает, что он может принимать много запросов одновременно. В модели программирования Node почти все выполняется асинхронно, но многие функции ядра Node.js имеют как синхронные, так и асинхронные версии. В большинстве случаев мы должны использовать асинхронные функции, чтобы получить преимущества Node.js. Вот пример сравнения синхронной и асинхронной модели с использованием file_system.readFile

Пример: синхронно читает файл

Здесь мы использовали fs.readFileSync (), который является синхронной версией fs.readFile (). Он также возвращает содержимое имени файла.

 var fs = require ('fs'); 
var content = fs.readFileSync ("readme.txt", "utf8"); console.log (содержание); console.log ('Чтение файла ...');

Выход:

«nodejs

Пример: асинхронно читает файл

 var fs = require ('fs');
fs.readFile ("readme.txt", "utf8", function (err, content) {
if (err) {
      вернуть console.log (err);
	     }
  console.log (содержание);
      });
console.log ('Чтение файла ...'); 

Выход :

«nodejs

Первый блок кода выглядит просто, readFileSync () прочитает весь файл и сохранит его в памяти, а затем перейдет к печати данных и сообщения в консоли (см. Вывод). Это синхронная версия, все приостанавливается до тех пор, пока файл не закончит чтение. Тем не менее, второй блок кода является асинхронной версией, но выглядит сложным. Здесь система готова для выполнения другой задачи - вместо этого вызывается функция обратного вызова, когда файл заканчивает чтение. Посмотрите вывод, он сначала выполняет последнюю команду и печатает «Чтение файла ...», а затем печатает содержимое файла.

Callbacks

Что такое обратные вызовы? Функция обратного вызова - это функция, которая передается другой функции в качестве параметра, а функция обратного вызова вызывается (выполняется) внутри второй функции. Функции обратного вызова выполняются асинхронно, вместо процедурного чтения сверху вниз. Если вы уже работали с JavaScript, есть вероятность, что вы уже видели обратные вызовы. Это важная тема, чтобы понять, как работает сервер Node.js. Например, мы пытаемся загрузить большой файл и не хотим, чтобы сервер блокировал все остальные запросы на выполнение задания на загрузку, скорее, мы хотим отправить это задание на загрузку в фоновом режиме и вызвать функцию после ее завершения. Поэтому сервер должен следовать второму правилу и может принимать другой запрос, пока он выполняет какие-то действия в фоновом режиме и делает другой код неблокирующим.

В синхронной программе вы можете писать коды следующим образом:

var content;
function readingfile() {
var fs = require('fs');
content = fs.readFileSync("readme.txt", "utf8");
return content;
}
readingfile();
console.log(content);

В приведенном выше блоке кода мы определили функцию readfile (), задачей которой является чтение файла и сохранение его содержимого в переменной. Когда вызывается функция, если для чтения данных требуется много времени, чтобы загрузить данные, то это приводит к тому, что вся программа блокируется - иначе она называется остановкой и ожиданием. Это ожидание синхронного кода - он последовательно запускается сверху вниз.

Node.js использует обратные вызовы, будучи асинхронной платформой, он не ожидает, как запрос к базе данных, файловый ввод / вывод для завершения. Функция обратного вызова вызывается при завершении данной задачи; это предотвращает любую блокировку и позволяет запускать другой код в это время. Смотрите следующий пример:

var fs = require('fs');
var fcontent ;
function readingfile(callback){
fs.readFile("readme.txt", "utf8", function(err, content) {
fcontent=content;
 if (err) 
 {
 return console.error(err.stack);
  }
callback(content);
})
};
function mycontent() {
  console.log(fcontent);
}
readingfile(mycontent);
console.log('Reading files....');

В приведенном выше примере функция mycontent () может быть передана в аргументе, который станет переменной обратного вызова внутри функции readingfile (). После завершения чтения файла с помощью readFile () будет вызвана переменная обратного вызова (callback ()). Только функция может быть вызвана, поэтому передача чего-либо, кроме функции, вызовет ошибку. Когда функция вызывается, выполняется код внутри этой функции (здесь будет выполняться оператор console.log (fcontent)).

На первый взгляд приведенный выше код выглядит не слишком сложным, но обратный вызов является основой Node.js. Это позволяет вам выполнять столько операций ввода-вывода, сколько ваша ОС может обрабатывать одновременно. Например, предположим, что на веб-сервере имеются сотни или тысячи ожидающих запросов с несколькими запросами на блокировку, но выполнение запросов на блокировку асинхронно дает вам возможность работать непрерывно, а не просто сидеть и ждать, пока операции блокировки не вернутся.

В вышеуказанной среде, как правило, обратный вызов является последним параметром, а значение ошибки - первым параметром обратного вызова. Обратный вызов вызывается после того, как функция выполнена со всеми ее операциями. Если возникает какая-либо ошибка, функция вызывает обратный вызов с первым параметром, являющимся объектом ошибки, в противном случае (в случае прозрачного выполнения) функция вызывает обратный вызов с первым параметром, являющимся нулевым, а остальные - возвращаемым значением (ями).

Предыдущая: Установка node.js в Windows и Linux
Далее: Node.js REPL

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code