Это начало введения в блокирующую природу JavaScript. В процессе вы также будете больше изучать различные модули Node, например fs.

Это обязательное чтение для предкурса Code Chrysalis Immersive Bootcamp - серии заданий, проектов, оценок и работ, которые все студенты должны успешно выполнить удаленно, прежде чем приступить к нашему полному курсу программной инженерии.

Прежде чем вы начнете

  • На вашем компьютере должен быть установлен Node. Простой способ описания Node состоит в том, что это программа, которая позволит вам запускать JavaScript на вашем компьютере (а не только в браузере). Это означает, что вы сможете контролировать, помимо прочего, свою файловую систему! Если вы новичок в Node, пожалуйста, посетите Node School, чтобы начать работу.
  • Это практическое руководство, поэтому вам нужно будет следить за ним и самостоятельно экспериментировать с кодом.
  • Умение просматривать и читать документацию - очень важный навык для инженеров-программистов. Попрактикуйтесь в чтении документации по NodeJS по мере прохождения этого руководства. Обратите внимание на имеющуюся у вас версию Node и версию документации, которую вы просматриваете.

Цели

  • Ознакомьтесь с использованием fs
  • Используйте fs.readFileSync для чтения файлов в локальной системе
  • Используйте слова синхронный и блокирующий для описания определенных аспектов JavaScript.

Синхронный и блокирующий

Давайте создадим функцию:

console.log('1');
function hello() {
  console.log('hello');
}
console.log('2');
hello();
console.log('3');

Вы можете предсказать результат?

Отвечать:

1
2
hello
3

Что, если бы hello вместо этого был длительной операцией? Как поиск в базе данных или HTTP-запрос? Не беспокойтесь о том, как это реализовано, просто предполагалось, что если бы это было так, то hello потребовалось бы намного больше времени для завершения.

Означает ли это, что мы не можем вызвать последний console.log, пока он не будет завершен? С JavaScript - да. Это потому, что JavaScript может делать только одну вещь за раз (расширенный: однопоточный). Это будет то, что мы называем синхронной операцией.

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

В браузере это может означать, что веб-страница не отвечает.

На сервере это может означать, что запросы перестают обрабатываться.

Немного переключаю передачи…

Представляем fs

В отличие от браузера, где все глобально, в Node есть только две глобальные вещи: объект module и функция require().

Мы поговорим о module позже, а пока давайте require() fs:

const fs = require('fs');
console.log(fs);

Что такое fs? Узнать это можно двумя способами:

  • Проверить документы
  • console.log() it!

Мы видим много file связанных методов, поэтому можно сделать вывод, что это означает «файловая система».

В вашем текущем каталоге выполните следующую команду:

echo 'hello world' >> index.js

Затем запустите в Node следующее:

const fs = require('fs');
const result = fs.readFileSync('index.js', 'utf8');
console.log(result);

Какой результат? Что произойдет, если вы не включите «utf8»? Что такое «utf8»?

Блокирующее поведение

Обратите внимание, что в нашем примере выше console.log не запускается, пока мы не закончим чтение файла. Попробуйте изменить index.js так, чтобы это был огромный кусок кода. Это меняет порядок?

No.

Это потому, что fs.readFileSync является точным, как следует из его названия - это синхронный метод и, следовательно, блокирующий. Независимо от размера файла, наш JavaScript будет ждать, пока fs.readFileSync полностью не закончит его чтение.

Давайте проверим это с помощью обычного JavaScript.

Блокирующее поведение с функциями высшего порядка

Давайте сейчас создадим функцию более высокого порядка и предоставим ей hello в качестве обратного вызова.

console.log('1');
function hello() {
  console.log('hello');
};
console.log('2');
function invokeNow(action) {
  console.log('3');
  action();
}
console.log('4');
invokeNow(hello)
console.log('5');

Вы можете предсказать результат?

Отвечать:

1
2
4
3
hello
5

invokeNow(hello) по-прежнему блокирует. Нам нужно дождаться, пока все это будет сделано, прежде чем мы напечатаем 5.

Вызовы

  1. Можете ли вы использовать fs.readFileSync() для чтения файлов, не относящихся к JavaScript? Как файл JSON или текстовый файл (.txt)? Как насчет HTML-файла? Попробуй.
  2. Какие еще варианты помимо «utf8»?
  3. Противоположность синхронному называется асинхронным. Как вы думаете, что означает асинхронность?
  4. Исследуй fs.readFile. Это асинхронная версия fs.readFileSync. Как ты это используешь? Что он делает по-другому?

Ресурсы

Вот пара ресурсов. Это не единственные ресурсы в Интернете, поэтому, пожалуйста, посмотрите вокруг и найдите другие ресурсы, которые можно дополнить по мере необходимости.

А как насчет асинхронного Javascript? 👉 Прочтите Учебник: асинхронный JavaScript - обратные вызовы, обещания и асинхронный / ожидающий

Code Chrysalis - это токийская школа программирования, предлагающая курсы программирования на полный и неполный рабочий день на английском и японском языках. Присоединяйтесь к нам лично или посещайте наши занятия удаленно. Узнайте, почему мы являемся лидером в области технического образования в Японии 🗾.

Мы также проводим бесплатные семинары и мероприятия для сообщества, так что следите за нами, чтобы быть в курсе последних новостей! Чтобы узнать о нас больше, перейдите на наш сайт.

Следуйте за нами на…
YouTube - https://www.youtube.com/c/codechrysalis
Средний блог - https://medium.com/code-chrysalis
Примечание Блог - https://note.com/codechrysalis
Instagram - https://www.instagram.com/codechrysalis
Facebook - https://www.facebook.com/codechrysalis
Twitter - https://www.twitter.com/codechrysalis
Версия Twitter - https://www.twitter.com/codechrysalisJP
LinkedIn - https : //www.linkedin.com/school/code-chrysalis/