Подтвердить что ты не робот

Не могу понять node.js

От кого-то, у кого мало опыта в JS, что вы рекомендуете для изучения Node.js?

Я много читал в форуме о событиях, неблокирующих, асинхронных, обратных вызовах и т.д., но я не знаю, что это!

Где я могу изучить основы, чтобы понять все эти термины и в будущем, Node.js?

Спасибо!

4b9b3361

Ответ 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 заполняет очень конкретную нишу - он предназначен для создания сетевых программ. Это может быть не лучший инструмент для других типов программ.

Ответ 2

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

В Node большинство функций, которые вы можете вызвать, не блокируются. Например, когда вы вызываете fs.ReadStream(), он возвращает объект ReadableStream. Этот объект является EventEmitter, поэтому для того, чтобы что-либо сделать с содержимым потока, вам нужно прикрепить слушателя к объекту, который является функцией, вызываемой при возникновении определенного события.

Итак, что-то вроде этого работает:

var fs=require('fs');
var stream = fs.createReadStream("/var/log/messages", { 'flags':'r' });
stream.addListener('data', function(someData) {
        console.log(someData);
});

Это считывает весь текст из данного файла и записывает его на консоль. Когда есть данные для чтения из потока, ваша функция вызывается и передается данные из файла.

Интересно, что после того, как больше нет данных для чтения из файла, выйдет script. Node работает только до тех пор, пока есть действительный прослушиватель событий, подключенный к эмиттеру, или активен другой асинхронный обратный вызов (например, таймер).

Ответ 3

"Javascript: The Good Parts" - одна из лучших книг, когда-либо изучавших язык и язык, а не только DOM вещи.

Ответ 4

Ну, в этом вопросе Stackoverflow есть много аксессуаров, которые научат вас больше узнавать JS.

https://stackoverflow.com/info/3696199/how-can-i-truly-master-javascript/3696765#3696765

Основы JavaScript на самом деле те же основы, что и любые другие языки (приложение hello world и т.д.), реальная разница заключается в "продвинутых" областях JavaScript.