1. Роль Node.js,
Значение ввода/вывода (ввод/вывод - это аббревиатура ввода/вывода, такого как: текст типа клавиатуры, вход и текст отображается на экране. Мышь перемещается, мышь перемещается, мышь перемещается на экране, вход терминала, а также вид вывода и т. Д.)
Проблема, которую node.js хочет решить (процесс ввода, высокая параллельность. Например, в онлайн-играх могут быть миллионы геймеров, а миллионы входов и т. Д.) (Node.js подходит для категории: Node.js является наиболее подходящим, когда приложение необходимо для отправки и получения данных в сети. Это может быть стороннее API, сетевое устройство или в реальном времени между сервером и сервером и реальным мотивами между сервером и сервером и в реальном времени.
Значение параллелизма (термин параллелизм описывает, что все будет происходить в одно и то же время и может взаимодействовать друг с другом. Собывшая модель ввода -вывода узела позволяет нам избежать общих проблем взаимодействия и параллелистики в многопоточном асинхронном вводе/выводе).
Демонстрационная сеть ввода/вывода
JS -код
var http = require ('http'), urls = ['www.baidu.com', 'www.10jqka.com.cn', 'www.duokan.com']; функция fetchPage (url) {var start = new Date (); http.get ({host: url}, function (res) {console.log ("gat response from:" + url); console.log ("запрос взял:", new Date () - Start, "ms");}); } for (var i = 0; i <urls.length; i ++) {fetchPage (urls [i]); }Назван Node.js
Мы запускаем Node Node.js в терминале
Выход:
Мы требуем, чтобы node.js доступа к трем URL и сообщить о полученном ответе и о времени, которое он потребовался.
Мы видим, что время вывода отличается в течение двух раз. Повлияно на различные факторы, время для разрешения запросов DNS, занятых серверных программ и т. Д.
Почему JavaScript-это язык, основанный на событиях
JavaScript вращается вокруг архитектуры события, которая была первоначально связана с моделью объекта документа (DOM). Разработчики могут делать вещи, когда происходят события. Эти события включают пользователей, нажимая на элемент, страница завершает загрузку и т. Д. Используя события, разработчики могут писать слушателей для событий, которые запускаются, когда происходят события.
2. обратный вызов
1. Что такое обратный вызов
2. Проанализируйте обратный вызов
Обратный вызов относится к передаче функции в качестве аргумента другой функции и обычно называется после завершения первой функции.
Пример: например, метод hide () в jQuery,
JS -код
1, $ ("p"). Hide ('Mlow'); 2, $ ("p"). Hide ('slow', function () {alert ("Абаграф теперь скрыт")});Обратные вызовы являются необязательными.
1 Не требуется обратный вызов
2. Есть обратный вызов. Когда абзац будет скрыт, он будет вызван, показывая предупреждение.
Чтобы увидеть разницу между кодом с обратными вызовами и без него
JS -код
$ ("p"). Hide ('Slow'); ALERT («Параграф теперь скрыт»); // 1 $ ("p"). Hide ('slow', function () {alert ("Абаграф теперь скрыт")}); // 21. Там нет обратного вызова, и порядок выполнения одинаково. Тем не менее, мы видим, что параграф P не был полностью скрыт, выходит Alert.
2. Существует обратный вызов, и выполнение выполняется после завершения шкуры.
Анализировать обратные вызовы
JS -код
Функция hAsbreakfast (еда, напиток, обратный вызов) {console.log («Имея баракфста из ' + еда +', ' + напиток); if (callback && typeof (callback) === "function") {callback (); }} halebreakfast ('fastast', 'coffee', function () {console.log ('готовый завтрак. Время идти на работу!');});Выход:
Направляя барактером из пены, завтрак на кофейне. Время пойти на работу!
Вот функция, созданная с тремя параметрами, третий параметр - обратный вызов, который должен быть функцией.
Функция HASBREAKFAST записывает то, что вы едите в консоли, а затем вызывает функцию обратного вызова, переданную ей в качестве параметра.
Как использовать обратные вызовы для node.js
Пример использования модуля файловой системы для чтения содержимого файла с диска в node.js
JS -код
var fs = require ('fs'); fs.readfile ('somefile.txt', 'utf8', function (err, data) {if (err) throw err; console.log (data);});Результатом является: контент в somefile.txt.
1. Модуль FS (файловая система) запрошен для использования в скрипте
2. Путь файла в файловой системе предоставляется в качестве первого параметра для метода fs.readfile.
3. Второй параметр - UTF8, который указывает кодирование файла
4. Предоставьте функцию обратного вызова в качестве третьего параметра для метода fs.readfile
5. Первым параметром функции обратного вызова является ERR, который используется для сохранения ошибки, возвращаемой при чтении файла.
6. Второй параметр функции обратного вызова - это нажать его, и пользователь сохраняет данные, возвращаемые файлом чтения.
7. После того, как файл будет считан, обратный вызов будет вызван.
8. Если ERR верна, будет выброшена ошибка.
9. Если ERR является false, то можно использовать данные из файла.
10. В этом случае данные будут записаны на консоли.
Другим является модуль HTTP, модуль HTTP позволяет разработчикам создавать HTTP -клиентов и серверы.
JS -код
var http = require ('http'); http.get ({host: 'shapeshed.com'}, function (res) {console.log ("at response:" + res.statuscode);}). On ('error', function (e) {console.log ("at error:" + e.message);});Результат: получил ответ: 200
1. Запросите модуль HTTP для использования в сценарии
2. Предоставьте два параметра для метода http.get ()
3. Первый параметр - это объект опции. В этом примере вам нужно получить домашнюю страницу Shapeshed.com
4. Второй параметр - это функция обратного вызова с ответом в качестве параметра
5. Когда удаленный сервер возвращает соответствующую функцию, функция обратного вызова будет запускается.
6. Запишите код состояния ответа в функции обратного вызова. Если есть ошибка, вы можете записать ее.
Далее, давайте посмотрим, что 4 различные операции ввода/вывода происходят, все они используют обратные вызовы
JS -код
var fs = require ('fs'), http = require ('http'); http.get ({host: 'www.baidu.com'}, function (res) {console.log ("baidu.com");}). On ('erron', function (e) {console.log ("at error:" + e.message);}); fs.readfile ('somefile.txt', 'utf8', function (err, data) {if (err) throw err; console.log ("somefile");}); http.get ({host: 'www.duokan.com'}, function (res) {console.log ("duokan.com");}). On ('erron', function (e) {console.log ("at error:" + e.message);}); fs.readfile ('somefile2.txt', 'utf8', function (err, data) {if (err) throw err; console.log ("comefile2");});Можем ли мы узнать, какая операция возвращается в первую очередь?
Предполагается, что два файла, считываемые с диска, возвращаются в первую очередь, потому что нет необходимости входить в сеть, но нам трудно сказать, какой файл вернется первым, потому что мы не знаем размер файла. Для приобретения двух домашних страниц сценарий должен войти в сеть, и время отклика зависит от многих непредсказуемых вещей. Процесс node.js не выходит, пока не будет зарегистрированный обратный вызов, который не был запускается. Обратные вызовы сначала решают непредсказуемость, и это также эффективный способ справиться с параллелизмом (или делать более чем одну вещь за раз).
Вот результаты моего исполнения
Синхронный и асинхронный код
Сначала посмотрите на код, синхронизируйте (или блокируйте) код
JS -код
Функция Sleep (миллисекунд) {var start = new Date (). getTime (); while ((new date (). gettime () -Start) <миллионы второго коэффициента) {}} функция fetchpage () {console.log ('fetching page'); Сон (2000); console.log ('данные возвращаются с запроса страницы'); } function fetchapi () {console.log ('Fetching API'); Сон (2000); console.log ('данные, возвращаемые из API'); } fetchPage (); fetchapi ();Когда сценарий работает, будет вызвана функция fetchPage (). Пока он не вернется, запуск сценария заблокирован. До возвращения функции fetchPage () программа не может быть перемещена на функцию fetchapi (). Это называется операцией блокировки.
Node.js почти никогда не использует этот стиль кодирования, но вызывает обратные вызовы асинхронно.
Посмотрите на следующий код,
JS -код
var http = require ('http'); функция fetchPage () {console.log ('fetching page'); http.get ({host: 'www.baidu.com', path: '/? delay = 2000'}, function (res) {console.log ('Данные, возвращаемые из запроса страницы');}). On ('erry', function (e) {console.log ("была ошибка" + e);}); } function fetchapi () {console.log ('Fetching API'); http.get ({host: 'www.baidu.com', path: '/? delay = 2000'}, function (res) {console.log ('Данные, возвращаемые из запроса api');}). On ('error', function (e) {console.log ("была ошибка" + e);}); } fetchPage (); fetchapi ();Когда этот код будет разрешен, вы больше не ждете функции fetchPage () вернуть, и функция fetchapi () будет вызвана немедленно. Код заблокирован с помощью обратных вызовов. После вызова обе функции прослушивают возврат удаленного сервера и запускают функцию обратного вызова.
Обратите внимание, что порядок возврата этих функций не может быть гарантирован, но связан с сетью.
Петля мероприятия
Node.js использует цикл событий JavaScript для поддержки асинхронного стиля программирования, который он выступает. По сути, цикл события позволяет системе сначала сохранять функцию обратного вызова, а затем работать, когда событие произойдет в будущем. Это могут быть данные возврата базы данных или данные возврата HTTP -запроса. Поскольку выполнение функции обратного вызова отложена до тех пор, пока событие не будет изменено, нет необходимости останавливать выполнение, и поток управления может вернуться в среду выполнения узла, что позволяет случиться другие вещи.
Node.js часто рассматривается как структура сетевого программирования, поскольку он предназначен для обработки неопределенности в потоках данных в сети. Что способствует таким проектам, так это циклы событий и использование обратных вызовов, и они похожи на программистов, которые могут писать асинхронный код, который отвечает на события сети или ввода -вывода.
Правила, которые следует соблюдать: функция должна возвращаться быстро, функция не должна быть заблокирована, а длительные операции должны быть перемещены в другой процесс.
То, что не подходит для node.js, включает в себя обработку больших объемов данных или запуска расчетов в течение длительного времени. Node.js предназначен для того, чтобы нажимать данные в сети и мгновенно завершить их.