Ответ 1
Указанные вами концепции (управляемые событиями, неблокирующие, асинхронные, обратные вызовы) не являются специфическими для JavaScript и понимание их в более общем контексте ценно. Все они вращаются вокруг грамотно обрабатывающих ресурсов, над которыми мы не контролируем.
Представьте, что вы ожидаете передачи данных из TCP-соединения, ожидая, пока ОС удалит файл, или ждет, пока пользователь нажмет кнопку. Если вы запрограммировали это поэтапно (шаг за шагом будет синхронно), вы совершите кругосветное путешествие - "сделайте шаг 1", "сделайте шаг 2", "сделайте шаг 3" - пока вы не нажмете на шаг "Ждите, чтобы что-то произошло". В этот момент ваша программа остановится и откажется сдвинуться с места, пока не получит данные, не получит подтверждение подтверждения или не получит нажатие кнопки. Другими словами, вызов блокирует программу от продолжения. Это довольно неэффективно, учитывая, что, вероятно, существуют другие TCP-соединения, операции с файлами и действия пользовательского интерфейса, которые требуют нашего внимания и не зависят от того, что мы ожидаем.
Во многих случаях было бы лучше указать, что мы заинтересованы в ресурсе и получаем уведомления за пределами пошаговых инструкций при изменении ресурса. Из вашего списка понятий:
- События - это изменения в интересующих вас ресурсах - наше TCP-соединение получило некоторые данные, удаление файла завершено или пользователь нажал кнопку.
- Asynchronous звонки говорят OS или время выполнения, что мы заинтересованы в том, чтобы что-то делать с ресурсом. Они неблокируются - наша программа может работать над чем-то еще, пока она ждет изменения в ресурсе.
- Обратные вызовы - это функции, которые будут выполняться при изменении ресурса. Асинхронный вызов ресурсов часто принимает одну или несколько ссылок на функции обратного вызова (один для успеха, один для ошибки и т.д.). Когда ресурс изменяется, среда выполнения вызывает соответствующий обратный вызов.
Мы можем видеть эти концепции, проиллюстрированные переименованием файла с помощью node.js:
var fs = require('fs');
// args (current file name, new file name, callback function)
fs.rename('/tmp/hello', '/tmp/world', function (err) {
// this occurs when the rename is complete
if (err) throw err;
console.log('rename complete');
});
console.log('step after rename');
Третий аргумент может показаться странным. Это неназванная (anonymous) функция, которая будет вызываться, когда переименование будет завершено.
Обратите внимание, что поскольку fs.rename является асинхронным, невозможно определить, увидим ли мы сначала сообщение "переименование завершено" или "шаг после переименования". То, что недостаток к управляемому событиям/асинхронному программированию - если у нас есть сложный набор взаимозависимых задач, мы должны быть чрезвычайно осторожны, чтобы обеспечить выполнение зависимых задач до задач, зависящих от них. Тот факт, что порядок завершения асинхронного вызова может измениться, может привести к очень тонким ошибкам.
См. также:
- Обучающий процесс, управляемый событиями
- Закрытие - более сложная манипуляция первоклассными функциями
Отредактируйте запрос на Donald:
Лучший способ понять node.js - загрузить, установить, установить и использовать его. Вам понадобится:
- Mac OS или Linux. Если вам удобно работать с Cygwin, это также может быть вариантом, но если вы используете Windows, мне проще запустить Linux на виртуальной машине.
- Git - не требуется, но облегчает извлечение репозитория кода.
- Способ отладки вашего приложения. См. этот вопрос. Вначале может работать запись отладочной информации на консоль. В конце концов вам понадобится надежная отладка.
- Идея - что вы хотите делать с node.js? Если вам интересен обзор его возможностей, просмотрите его API.
В большинстве руководств сосредоточена на node.js способность быстро создавать Http-сервер:
- Переход с node.js (показывает простую версию загрузки хранилища, сборки и установки)
- Игровое лобби
- Сервер Http с шаблоном HTML
Имейте в виду, что node.js заполняет очень конкретную нишу - он предназначен для создания сетевых программ. Это может быть не лучший инструмент для других типов программ.