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

Содержание
  1. Введение На протяжении многих лет многие разработчики пытались вернуть JavaScript в качестве серверного языка. В JSConf 2009 Райан Даль представил Node.js, серверный язык, основанный на v8. С тех пор он стал быстро распространяться среди разработчиков. В этом руководстве мы обсудим фундаментальные программные конструкции, за которыми следует язык. JavaScript и Node по расширению являются однопоточными, а Node использует неблокирующий ввод-вывод и асинхронную модель, управляемую событиями. Никогда не блокировка ввода-вывода означает меньшее количество потоков. Он очень похож на Event Machine Ruby или Twisted в Python, но Node представляет цикл событий как языковую конструкцию, а не как библиотеку. В этом руководстве мы обсудили две важные модели программирования: асинхронную модель и обратные вызовы. Позже мы обсудим другую базовую модель Генераторы событий Асинхронная модель Давайте обсудим асинхронную модель на простом примере использования. Вы, должно быть, видели, как реклама (или подобный сторонний контент), загружаемая на веб-страницу, иногда вызывает большую задержку. Если они загружаются асинхронно, они не будут блокировать загрузку других компонентов веб-страницы (например, контента). Это улучшит взаимодействие с пользователем и оптимизирует использование полосы пропускания, особенно для мобильных пользователей, которые в настоящее время составляют значительную часть интернет-зрителей. Узел не блокирует, что означает, что он может принимать множество запросов одновременно. В модели программирования 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 ('Файл чтения ...'); Вывод: Пример: асинхронно читает файл var fs = require ('fs'); fs.readFile (" readme.txt "," utf8 ", функция (ошибка, контент) {если (ошибка) {return console.log (ошибка);} console.log (контент);}); console.log ('Чтение файла ...'); Вывод: Первый блок код выглядит простым, readFileSync () прочитает весь файл и сохранит его в памяти, а затем перейдет к печати данных и сообщения в консоли (см. вывод). Это синхронная версия, все приостанавливается до завершения чтения файла. Однако второй блок кода является асинхронной версией, но выглядит сложным.. Здесь система готова к выполнению другой задачи — вместо этого вызывается функция обратного вызова, когда чтение файла завершается. Посмотрите на результат, он сначала выполняет последнюю команду и печатает «Чтение файла …», затем печатает содержимое файла. Обратные вызовы Что такое обратные вызовы ? Функция обратного вызова — это функция, которая передается другой функции в качестве параметра, а функция обратного вызова вызывается (выполняется) внутри второй функции. Функции обратного вызова выполняются асинхронно, вместо процедурного чтения сверху вниз. Если вы уже работали с JavaScript, возможно, вы уже видели обратные вызовы. Это важная тема для понимания того, как работает сервер Node.js. Например, мы пытаемся загрузить большой файл и не хотим, чтобы этот сервер блокировал все остальные запросы на завершение задания загрузки, скорее мы хотим отправить это задание загрузки в фоновом режиме и вызвать функцию, когда она будет завершена. Следовательно, сервер должен следовать второму правилу и может принимать другие запросы, пока он что-то делает в фоновом режиме и делает другой код неблокирующим. В синхронной программе вы можете писать коды следующим образом: var content; function readingfile () {var fs = require ( 'fs'); content = fs.readFileSync ("readme.txt", "utf8"); return content;} readfile (); console.log (content); В приведенном выше блоке кода мы определили функцию с именем readfile (), задачей которой является чтение файла и сохранение его содержимого в переменной. Если при вызове функции считывание данных занимает много времени для загрузки данных, это приводит к «блокировке» всей программы — иначе говоря, «сидеть неподвижно и ждать». Это ожидание синхронного кода — он последовательно выполняется сверху вниз. Node.js использует обратные вызовы, будучи асинхронной платформой, он не ждет, как запрос к базе данных, файловый ввод-вывод для завершения . Функция обратного вызова вызывается по завершении данной задачи; это предотвращает любую блокировку и позволяет одновременно запускать другой код. См. Следующий пример: var fs = require ('fs'); var fcontent; function readingfile (callback) {fs.readFile ("readme.txt", "utf8 ", функция (ошибка, контент) {fcontent = content; if (err) {return console.error (err.stack);} callback (content);})}; function mycontent () {console.log (fcontent); } readfile (mycontent); console.log ('Чтение файлов ....'); В приведенном выше примере функции mycontent () можно передать аргумент, который будет стать переменной обратного вызова внутри функции readfile (). После завершения чтения файла с помощью readFile () будет вызвана переменная обратного вызова (callback ()). Может быть вызвана только функция, поэтому передача чего-либо, кроме функции, вызовет ошибку. Когда функция вызывается, код внутри этой функции выполняется (здесь будет выполняться инструкция console.log (fcontent)). На первый взгляд, приведенный выше код выглядит излишне сложным, но обратный вызов является основой Node.js. Это позволяет одновременно выполнять столько операций ввода-вывода, сколько может обрабатывать ваша ОС. Например, предположим, что на веб-сервере есть сотни или тысячи ожидающих запросов с несколькими блокирующими запросами, но выполнение блокирующих запросов асинхронно дает вам возможность работать непрерывно, а не просто сидеть и ждать, пока не вернутся блокирующие операции. В приведенной выше среде, как правило, обратный вызов является последним параметром, а значение ошибки — первым параметром обратного вызова. Обратный вызов вызывается после того, как функция выполнит все свои операции. Если возникает какая-либо ошибка, функция вызывает обратный вызов с первым параметром, являющимся объектом ошибки, в противном случае (в случае чистого выполнения) функция вызывает обратный вызов с первым параметром, равным нулю, а остальным — возвращаемым значением (ями).
  2. Асинхронная модель
  3. Обратные вызовы

Введение

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

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

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

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

Узел не блокирует, что означает, что он может принимать множество запросов одновременно. В модели программирования 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 ('Файл чтения ...');

Вывод:

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

 var fs = require ('fs'); fs.readFile (" readme.txt  "," utf8 ", функция (ошибка, контент) {если (ошибка) {return console.log (ошибка);} console.log (контент);}); console.log ('Чтение файла ...');  

Вывод:

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

Обратные вызовы

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

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

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

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

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

  var fs = require ('fs'); var fcontent; function readingfile (callback) {fs.readFile ("readme.txt", "utf8  ", функция (ошибка, контент) {fcontent = content; if (err) {return console.error (err.stack);} callback (content);})}; function mycontent () {console.log (fcontent);  } readfile (mycontent); console.log ('Чтение файлов ....');  

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

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

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

Оцените статью
nanomode.ru
Добавить комментарий