2010-09-14 3 views
18

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

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

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

Спасибо!

+4

Начните с написания много javascript-программ и заботы о том, чтобы все было хорошо и правильно. Нет смысла даже рассматривать NodeJS, если вы не понимаете javascript и соответствующие методы. Я не хочу быть суровым, но это то, что вам нужно узнать; JavaScript и как он используется и используется должным образом, это основы. Ergo, сначала мастер javascript;) много тэнов на этом в stackoverflow. – BGerrissen

+0

Спасибо за ваш комментарий. Мне трудно учиться JS, потому что я не знаю, что с этим делать. Если я хочу изучить Django, Rails и т. Д. Я знаю, что делать, а не JavaScript. Кроме того, можете ли вы порекомендовать хорошую книгу, которая также может основывать знания node.js? thank – donald

+1

Просто посмотрел на node.js. Это просто использование синтаксиса JS, например jQuery. Считаете ли вы, что глубокое знание JavaScript было бы гораздо более полезным при использовании node.js? Во всяком случае, прочитанная книга - это JavaScript: окончательное руководство – mplungjan

ответ

49

Концепции, которые вы упоминаете (управляемые событиями, неблокирующие, асинхронные, обратные вызовы), не являются специфическими для JavaScript, и их понимание в более общем контексте является ценным. Все они вращаются вокруг грамотно обрабатывающих ресурсов, над которыми мы не контролируем.

Представьте, что вы ожидаете передачи данных из TCP-соединения, ожидая, пока ОС удалит файл, или ждет, когда пользователь нажмет кнопку. Если вы запрограммировали это поэтапно (шаг за шагом синхронно), вы совершили бы кругосветное путешествие - «сделать шаг 1», «сделать шаг 2», «сделать шаг 3» - пока вы нажмите «Подождать, пока что-то случится». В этот момент ваша программа остановится и откажется сдвинуться с места, пока не получит данные, не получит подтверждение подтверждения или не получит нажатие кнопки. Другими словами, звонок блокирует программу от продолжения. Это довольно неэффективно, учитывая, что, вероятно, существуют другие TCP-соединения, операции с файлами и действия пользовательского интерфейса, которые требуют нашего внимания и не зависят от элемента, которого мы ждем.

Во многих случаях было бы лучше указать, что мы заинтересованы в ресурсе и получаем уведомления за пределами пошаговых инструкций при изменении ресурса. Из вашего списка понятий:

  • Events изменения в ресурсах мы заинтересованы в том - наше соединение TCP получил некоторые данные, удаления файлов будет завершена, или пользователь нажал кнопку.
  • Asynchronous звонки говорят OS или время выполнения, что мы заинтересованы в том, чтобы что-то делать с ресурсом. Они неблокирующие - наша программа может работать над чем-то еще, пока она ждет изменения в ресурсе.
  • Callbacks - это функции, которые должны выполняться при изменении ресурса. Асинхронный вызов ресурсов часто принимает одну или несколько ссылок на функции обратного вызова (один для успеха, один для ошибки и т. Д.). Когда ресурс изменяется, среда выполнения вызывает соответствующий обратный вызов.

Мы можем видеть эти концепции, проиллюстрированные переименования файла с 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) функция, которая будет вызываться, когда переименование будет завершено.

Обратите внимание, что с ф.rename является асинхронным, невозможно определить, увидим ли мы сначала сообщение «переименовать полный» или «шаг после переименования». Это недостаток для управляемых событиями/асинхронного программирования - если у нас есть сложный набор взаимозависимых задач, нам нужно быть предельно осторожными, чтобы обеспечить выполнение зависимых задач до задач, зависящих от них. Тот факт, что порядок завершения асинхронного вызова может измениться, может привести к очень тонким ошибкам.

Смотрите также:


Обработать по запросу Дональдс:

Лучший способ понять node.js - загрузить, построить, установить ll, и использовать его. Вам понадобятся:

  • Mac OS или Linux. Если вам удобнее Cygwin, это также может быть вариантом, но если вы работаете под управлением Windows, мне проще запустить Linux на виртуальной машине.
  • Git - не требуется, но он облегчает выборку репозитория кода.
  • Способ отладки приложения. См. this question. Вначале может работать запись отладочной информации на консоль. В конце концов вам понадобится надежная отладка.
  • Идея - что вы хотите делать с node.js? Если вас интересует обзор его возможностей, просмотрите its API.

Большинство учебников сосредоточиться на способности Node.js, чтобы быстро построить сервер HTTP:

Имейте в виду, что node.js заполняет очень конкретную нишу - i t предназначен для создания сетевых программ. Возможно, это не правильный инструмент для других типов программ.

+1

Corbin, благодарю вас за ваше объяснение. Можете ли вы также добавить некоторые другие ссылки, которые могут помочь мне в понимании node.js? Что-то, что вы считаете уместным. Спасибо – donald

+0

Путь положить усилие в ваш ответ [upvoted] –

+0

Отличный ответ Corbin! –

0

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

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

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

6

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

В узле большинство функций, которые вы можете вызвать, являются неблокирующими. Например, когда вы вызываете 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); 
}); 

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

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

+1

Спасибо. То, что я не понимаю из этого примера, - это функция, называемая функцией (someData), и что такое «someData». Я не вижу ничего, что передает информацию аргументу someData. thanks – donald

+0

Объект потока начинает излучать эти события, вызывающую функцию (someData) за кулисами. – Unoti

+0

Право. Каждый излучатель событий имеет список прослушивателей событий для каждого события, которое он может запустить. Когда срабатывает событие, вызывается каждый из слушателей. –

4

«Javascript: The Good Parts» является одной из лучших книг, когда-либо изучавших язык и язык, а не только материал DOM.

Смежные вопросы