diff --git a/01-intro/css/user.css b/01-intro/css/user.css index c56b761..d6d5742 100644 --- a/01-intro/css/user.css +++ b/01-intro/css/user.css @@ -34,3 +34,7 @@ section .strike { text-decoration: line-through; color: #888; } + +.reveal { + background: #000; +} diff --git a/01-intro/index.html b/01-intro/index.html index 04a3432..3e46bfa 100644 --- a/01-intro/index.html +++ b/01-intro/index.html @@ -23,7 +23,7 @@
Жигалов Сергей
Дуглас Крокфорд, 2001
+
+
+
+ Works
+ true
+ 3
+
+
+ Лёша
+ cappuccino
+
+
+ Лиза
+ tea
+
+
+
+
+
@@ -120,27 +142,27 @@ JSON
-
-
- Works
- true
- 3
-
-
- Лёша
- cappuccino
-
-
- Лиза
- tea
-
-
-
+
+
64 бит
2^64 =わ 18446744073709552000
@@ -351,8 +371,39 @@ typeof
- Основы языка
- Переменные
+ Преобразование к числу
+
+
+
+
+parseInt(string, radix);
+
+
+
+parseInt('17', 10); // 17
+parseInt('123'); // 123
+parseInt('11', 2); // 3
+parseInt('a1', 10); // NaN
+parseInt('2b', 10); // 2
+
+
+
+
+
+parseFloat(строка)
+
+
+
+parseFloat('3.14'); // 3.14
+parseFloat('314e-2');// 3.14
+parseFloat('a1'); // NaN
+
+
+
+
+
+
+ Переменные
@@ -361,12 +412,21 @@ Переменные
var studentsCount;
studentsCount = 98;
+
+studentsCount; // 98;
+
+
var studentsCount = 98;
-var studentsCount = 98,
-language = 'JavaScript';
+var studentsCount,
+ language = 'JavaScript';
// Переменная
var currentTime;
@@ -413,17 +474,60 @@ Зарезервированные слова
delete in instanceof
typeof var void
- https://clck.ru/9auhk
+
+class enum extends super
+const export import
+
+spisokDruzey; // ❌
+tsena; // ❌
+
+
+
+friends; // ✅
+price; // ✅
+
+
-class enum extends super
-const export import
+ Именование переменных
+
+
+h, w; // ❌
+friendsListWithNameAndAge; // ❌
+
+
+
+height, width; // ✅
+myFriends; // ✅
+
+
+my_friends; // ❌
+
+
+
+myFriends; // ✅
+
+
+isCorrect = true;
+totalCount = 47;
+friends = [];
- https://clck.ru/9auhk
/* а это длинный комментарий
-написаный в несколько строк */
+написанный в несколько строк */
@@ -466,9 +570,9 @@ ++ (инкремент) -- (декремент) ++ (унарный плюс) - (унарный минус) ! (логическое НЕ)@@ -555,26 +660,27 @@
*=, /=, +=, -=, &=, ^=, |=
(присваивание с операцией)
var a = 1;
-a += 1;
a = a + 1;
+a += 1;
+
+ Условные операторы
+
if (language === 'JavaScript') {
likes = likes + 1;
} else {
likes = likes - 1;
}
-
-
+
+
likes = language === 'JavaScript' ?
likes + 1 :
likes - 1;
-
-
+
+
+
+ Точка с запятой
+
+
+ Точка с запятой
+
function getTrue() {
return true;
}
getTrue(); // true
-
-
+
+
+
+ Точка с запятой
+
function getTrue() {
return
true;
}
getTrue(); // undefined
-
+
+
+
+ Строгий режим
+
'use strict';
// этот код будет работать
// по современному стандарту ES5
-
+
+
+
+
+text = 'hello';
+
+text; // 'hello'
+
+
+
+'use strict';
-
+text = 'hello'; // ReferenceError:
+ // text is not defined
+
+ Жигалов Сергей
+ + + +
-function getCartSum(price, count) {
+function getCost(price, count) {
count = count || 1;
return price * count;
@@ -115,19 +134,19 @@ Аргументы. Значения по умол
-getCartSum(27.70, 10); // 🍏 277₽
-getCartSum(49.90); // 🍅 49.9₽
+getCost(27.70, 10); // 🍏 277₽
+getCost(49.90); // 🍅 49.9₽
-getCartSum(99999, 0); // 🚀 99999₽ ???
+getCost(9999, 0); // 🚀 9999 ???
-function getCartSum(price, count) {
+function getCost(price, count) {
if (count === undefined) {
count = 1;
}
@@ -137,9 +156,9 @@ Аргументы. Значения по умол
-getCartSum(27.70, 10); // 🍏 277₽
-getCartSum(49.90); // 🍅 49.9₽
-getCartSum(99999, 0); // 🚀 0₽
+getCost(27.70, 10); // 🍏 277₽
+getCost(49.90); // 🍅 49.9₽
+getCost(99999, 0); // 🚀 0₽
function example() {
- arguments[1]; // 12
+ arguments[1]; // 12
arguments.length; // 2
}
@@ -273,8 +292,8 @@ Методы функции. Call
+
// function expression
var add = function (a, b) {
return a + b;
@@ -392,7 +411,7 @@ Создание области видимости
}
text; // ReferenceError:
- // text is not defined
+ // text is not defined
┌{ greet }
├─┬{ text }
@@ -400,6 +419,7 @@ Создание области видимости
│ │
│
│
+│
│
* Standard ECMA-262 5.1 Edition
@@ -490,9 +511,10 @@ Затенение
-
- Всплытие
- Репин. "Бурлаки на Волге"
+
+
+ Всплытие
+
@@ -510,7 +532,7 @@ Выполнение кода
-
+
Всплытие функций
@@ -529,7 +551,7 @@ Всплытие функций
-
+
Всплытие функций
@@ -608,7 +630,7 @@ Всплытие переменных
-
+
Всплытие переменных
@@ -630,7 +652,7 @@ Всплытие переменных
-
+
+
+
+ Всплытие переменных
+
+
+
+function greet() {
+ var text = 'Привет';
+}
+
+
+ { greet: function }
+
+
+
+
+
+
+
+
+ Всплытие переменных
+
+
+
+function greet() {
+ var text = 'Привет';
+}
+
+
+
+{ greet: function, text: undefined }
+
+
+
+
+
+
+
+ Всплытие переменных
+
+
+
+function greet() {
+ var text = 'Привет';
+}
+
+
+
+
+{ greet: function, text: 'Привет' }
+
+
+
+
+
+
+ Всплытие переменных
+
+
+
+function greet() {
+ var text = 'Привет';
+}
+
+
+
+
+
+
+{ greet: function }
+
-
+
Замыкание
Микеланджело. "Сотворение Адама"
@@ -952,7 +1046,7 @@ IIFE
return date.toGMTString()
}
- return function(date) {
+ return function getDateString(date) {
date = date || new Date();
return format(date);
}
@@ -1003,8 +1097,8 @@ Почитать
// https://github.com/hakimel/reveal.js#configuration
Reveal.initialize({
controls: false,
- progress: true,
- slideNumber: true,
+ progress: false,
+ slideNumber: false,
history: true,
center: true,
hideAddressBar: true,
@@ -1022,23 +1116,23 @@ Почитать
hljs.initHighlightingOnLoad();
}
},
- {
- src: '../plugin/menu/menu.js'
- }
+ // {
+ // src: '../plugin/menu/menu.js'
+ // }
],
- menu: {
- side: 'left',
- numbers: true,
- titleSelector: 'h1, h2, h3, h4, h5, h6',
- hideMissingTitles: true,
- markers: true,
- custom: false,
- themes: false,
- transitions: false,
- openButton: true,
- openSlideNumber: false,
- keyboard: true
- },
+ // menu: {
+ // side: 'left',
+ // numbers: true,
+ // titleSelector: 'h1, h2, h3, h4, h5, h6',
+ // hideMissingTitles: true,
+ // markers: true,
+ // custom: false,
+ // themes: false,
+ // transitions: false,
+ // openButton: true,
+ // openSlideNumber: false,
+ // keyboard: true
+ // },
});
diff --git a/05-this/css/user.css b/05-this/css/user.css
index 6b4c090..8c527d3 100644
--- a/05-this/css/user.css
+++ b/05-this/css/user.css
@@ -49,3 +49,16 @@
.reveal ul.no-bullet li {
list-style-type: none;
}
+
+.reveal {
+ background: #000 !important;
+}
+
+body {
+ /*transform: scaleX(-1) !important;*/
+}
+
+.reveal .shadow,
+.reveal .shadow h3 {
+ text-shadow: 0 0 5px rgba(0, 0, 0, 0.5) !important;
+}
diff --git a/05-this/index.html b/05-this/index.html
index f814164..3567fc4 100644
--- a/05-this/index.html
+++ b/05-this/index.html
@@ -23,11 +23,11 @@
this
- Контекст исполнения
- Жигалов Сергей
+
+
-
+
-
+
this C#
@@ -190,7 +190,7 @@ this Java
public static void main(String []args){
User mike = new User();
- mike.showAge();
+ mike.showAge(); // 24
}
@@ -200,8 +200,8 @@ Свойства this
- ключевое слово
- - указывает на текущий объект
- нельзя перезаписать
+ - указывает на текущий объект
@@ -226,12 +226,12 @@ this JavaScript
- Свойства this
+ Свойства this в JavaScript
- ключевое слово
- - указывает на текущий объект
- нельзя перезаписать
+ - указывает на текущий объект
- можно использовать за пределом объекта*
@@ -337,10 +337,6 @@ I. Тип участка кода. Глобаль
window.innerWidth; // 1280
-
-
-innerWidth; // 1280
-
@@ -353,10 +349,6 @@ I. Тип участка кода. Глобаль
global.process.version; // "v7.0.0"
-
-
-process.version; // "v7.0.0"
-
@@ -414,6 +406,10 @@ I. Тип участка кода. Node.js мод
+
+ II. Как попали на участок кода
+
+
II. Как попали на участок кода. Простой вызов
@@ -654,7 +650,7 @@ II. Как попали на участок кода.
function func() {
- var args = Array.prototype.slice.call(arguments);
+ var args = [].slice.call(arguments);
}
@@ -808,7 +804,7 @@ 🍅 Результат
II. Как попали на участок кода. Callback
-
+
var person = {
name: 'Sergey',
items: ['keys', 'phone', 'banana'],
@@ -824,7 +820,7 @@ II. Как попали на участок кода.
-
+
┌{ person }
│
│
@@ -1022,7 +1018,7 @@ 🍏 Результат
myBind
-
+
Function.prototype.myBind = function(_this) {
var fn = this;
var args = [].slice.call(arguments, 1);
@@ -1060,7 +1056,7 @@ Частичное применение
II. Как попали на участок кода. Конструктор
- function User () {
+ function User () {
return {
age: 24,
@@ -1072,9 +1068,8 @@ II. Как попали на участок кода.
-
+
@@ -1085,7 +1080,6 @@ II. Как попали на участок кода.
@@ -1094,7 +1088,7 @@ II. Как попали на участок кода.II. Как попали на участок кода. Конструктор
- function User () {
+ function User () {
return {
age: 24,
@@ -1107,7 +1101,7 @@ II. Как попали на участок кода.
-
+
@@ -1118,7 +1112,6 @@ II. Как попали на участок кода.
@@ -1126,10 +1119,10 @@ II. Как попали на участок кода.
- Строгий режим
+ III. Режим работы интерпретатора
-
+
III. Режим работы интерпретатора. Режим совместимости
@@ -1368,8 +1361,8 @@ Сегодня
// https://github.com/hakimel/reveal.js#configuration
Reveal.initialize({
controls: false,
- progress: true,
- slideNumber: true,
+ progress: false,
+ slideNumber: false,
history: true,
center: true,
hideAddressBar: true,
@@ -1387,23 +1380,23 @@ Сегодня
hljs.initHighlightingOnLoad();
}
},
- {
- src: '../plugin/menu/menu.js'
- }
+ // {
+ // src: '../plugin/menu/menu.js'
+ // }
],
- menu: {
- side: 'left',
- numbers: true,
- titleSelector: 'h1, h2, h3, h4, h5, h6',
- hideMissingTitles: true,
- markers: true,
- custom: false,
- themes: false,
- transitions: false,
- openButton: true,
- openSlideNumber: false,
- keyboard: true
- },
+ // menu: {
+ // side: 'left',
+ // numbers: true,
+ // titleSelector: 'h1, h2, h3, h4, h5, h6',
+ // hideMissingTitles: true,
+ // markers: true,
+ // custom: false,
+ // themes: false,
+ // transitions: false,
+ // openButton: true,
+ // openSlideNumber: false,
+ // keyboard: true
+ // },
});
diff --git a/05-this/text.txt b/05-this/text.txt
new file mode 100644
index 0000000..5534b60
--- /dev/null
+++ b/05-this/text.txt
@@ -0,0 +1,64 @@
+1.
+Привет. На этой неделе я расскажу вам о ключевом слове this в языке JavaScript
+
+2.1. Возможно вы уже сталкивались с ним в других языках программирования.
+Например в си шарп мы можем использовать this в следующем примере.
+Объявим класс User который описывает некоторого пользователя.
+Он состоит из приватного поля age в котором записан возраст и публичного метода
+ShowAge поторый выводит на консоль возраст. Для того чтобы обратиться к полю класса
+из его метода мы используем ключевое слово this после которого указываем название поля.
+Таким образом создав экземпляр класса и позвав метод ShowAge мы увидим на консоли
+значение поля age
+
+2.2 Аналогичный пример мы можем написать на языке Java
+Класс User по прежнему состоит из публичного метода showAge в котором выводит
+на консоль значение приватного поля age, к которому обращаемся через ключевое слово this.
+После создания инстанса класса и вызова метода мы также как и в предыдущем примере
+
+2.3. Во всех этих примерах у this есть общие свойства.
+Это ключевое слово языка и мы не можем его перезаписать. Но самое главное,
+мы можем его использовать только в пределах объекта. За его пределами использование
+this не имеет смысла.
+
+2.4. Похожий пример на JavaScript мы можем написать следующим образом:
+Объявим функцию User которая возвращает объект, состоящий из двух полей: age и showAge
+Поле showAge обращяется к полю age через ключевое слово this. Создавая инстанс пользователя
+и вызывая метод showAge мы увидим на консоли значение которое сохранено в поле age
+
+
+...
+
+5.1. Как мы уже поняли в предыдущем видео значение this определяется в момент
+выполнения кода и зависит от нескольких факторов. В этом видео мы рассмотрим
+чему равен this на различных участках кода.
+
+5.2. Если мы обратимся к полю innerWith находясь в глобальном коде в браузере, то получим
+значение 1280 равное ширине окна. Такое же значение мы получаем, когда обращаемся
+к полю innerWith объекта window.
+
+5.3. При выполнении кода на nodejs обращаясь к свойству process.version мы
+получим строку содержащую версию нашего интерпретатора. Аналогичное значение
+мы получим если обратимся к process.version у глобального объекта.
+
+5.4. Вы наверняка не раз уже использовали console.log для вывода значений на консоль.
+Но мало кто задумывался что свойство console мы вызываем у глобального объекта
+
+...
+
+7.1. Следующий фактор, который влияет на значение this это способ,
+которым мы попали на тот или иной участок кода.
+
+7.2. Опишем функцию getSelf которая возвращает текущее значение this.
+При вызове такой функции возвращаемое значение будет равно текущему значению this.
+Таким образом если мы позовем getSelf в основном коде, то она вернет глобальный объект
+global или window в зависимости от того в каком окружении мы работаем
+
+7.3. Если мы вызываем эту функцию в рамках модуля, то она вернет объект,
+который модуль экспортирует. В нашем случае это объект, который содержит поле days
+со значением 366.
+
+8.1 Кроме простого вызова, мы можем вызвать функцию как метод объекта. Давайте
+рассмотрим такой пример: объявим объект `block` со свойством innerHeight и методом
+getHeight которое возвращает значение поля innerHeight в объекте this.
+Важно понимать, что this определяется не в момент описания функции, а в момент
+её выполнения
diff --git a/08-async/css/user.css b/08-async/css/user.css
index 05a25e5..67ee317 100644
--- a/08-async/css/user.css
+++ b/08-async/css/user.css
@@ -99,3 +99,20 @@
.reveal .red {
color: red;
}
+
+.reveal {
+ background: #000;
+}
+
+body {
+ /*transform: scaleX(-1) !important;*/
+}
+
+.reveal .shadow,
+.reveal .shadow h3 {
+ text-shadow: 0 0 5px rgba(0, 0, 0, 0.5) !important;
+}
+
+.reveal .w100 {
+ width: 100%;
+}
diff --git a/08-async/index.html b/08-async/index.html
index d070119..731fef3 100644
--- a/08-async/index.html
+++ b/08-async/index.html
@@ -24,7 +24,7 @@
Асинхронный код
Очередь событий. Таймеры. Callback. Promise
- Жигалов Сергей
+
@@ -108,7 +108,7 @@ Стек вызовов
prepareCoffee();
}
-
+toCheerUp();
@@ -378,7 +378,7 @@ Очередь событий
anonymous
-
+
@@ -404,7 +404,7 @@ Очередь событий
toCheerUp
anonymous
-
+
@@ -431,7 +431,7 @@ Очередь событий
toCheerUp
anonymous
-
+
@@ -458,7 +458,7 @@ Очередь событий
toCheerUp
anonymous
-
+
@@ -485,7 +485,7 @@ Очередь событий
toCheerUp
anonymous
-
+
@@ -512,7 +512,7 @@ Очередь событий
toCheerUp
anonymous
-
+
@@ -539,7 +539,7 @@ Очередь событий
anonymous
-
+
@@ -566,13 +566,13 @@ Очередь событий
-
+
-
+
Системный таймер
Сальвадор Дали «Постоянство времени»
@@ -823,7 +823,7 @@ setInterval
toStove();
setInterval(toStir, 1000);
- fromStove
+ toStir
'Поставить на плиту'
'Помешивать'
@@ -863,7 +863,7 @@ setInterval
toStove();
setInterval(toStir, 1000);
- fromStove
+ toStir
'Поставить на плиту'
'Помешивать'
'Помешивать'
@@ -903,7 +903,7 @@ setInterval
toStove();
setInterval(toStir, 1000);
- fromStove
+ toStir
'Поставить на плиту'
'Помешивать'
'Помешивать'
@@ -932,7 +932,7 @@ setInterval
-var id = setInterval(fromStove, 1000);
+var id = setInterval(toStir, 1000);
@@ -950,7 +950,7 @@ setInterval
console.log('Поставить на плиту');
setInterval(toStir, 1000);
-executionThreeSeconrs();
+runsThreeSeconds();
@@ -962,7 +962,7 @@ setInterval
console.log('Поставить на плиту');
setInterval(toStir, 1000);
-executionThreeSeconrs();
+runsThreeSeconds();
anonymous
@@ -979,7 +979,7 @@ setInterval
console.log('Поставить на плиту');
setInterval(toStir, 1000);
-executionThreeSeconrs();
+runsThreeSeconds();
'Поставить на плиту'
@@ -997,7 +997,7 @@ setInterval
console.log('Поставить на плиту');
setInterval(toStir, 1000);
-executionThreeSeconrs();
+runsThreeSeconds();
'Поставить на плиту'
@@ -1015,7 +1015,7 @@ setInterval
console.log('Поставить на плиту');
setInterval(toStir, 1000);
-executionThreeSeconrs();
+runsThreeSeconds();
'Поставить на плиту'
@@ -1033,9 +1033,9 @@ setInterval
console.log('Поставить на плиту');
setInterval(toStir, 1000);
-executionThreeSeconrs();
+runsThreeSeconds();
- fromStove
+ toStir
'Поставить на плиту'
@@ -1051,9 +1051,9 @@ setInterval
console.log('Поставить на плиту');
setInterval(toStir, 1000);
-executionThreeSeconrs();
+runsThreeSeconds();
- fromStove fromStove
+ toStir toStir
'Поставить на плиту'
@@ -1069,9 +1069,9 @@ setInterval
console.log('Поставить на плиту');
setInterval(toStir, 1000);
-executionThreeSeconrs();
+runsThreeSeconds();
- fromStove fromStove fromStove
+ toStir toStir toStir
'Поставить на плиту'
@@ -1087,7 +1087,7 @@ setInterval
console.log('Поставить на плиту');
setInterval(toStir, 1000);
-executionThreeSeconrs();
+runsThreeSeconds();
'Поставить на плиту'
@@ -1299,7 +1299,7 @@ Пример
-
+
var fs = require('fs');
var fileName = __dirname + '/data.json';
@@ -1315,6 +1315,10 @@ Пример
+
+ callback
+
+
callback
@@ -1402,8 +1406,8 @@ callback. Недостатки
-
+
var promise = new Promise(function (resolve, reject) {
@@ -1558,7 +1562,7 @@ Promises. Асинхронный код
Promises. Асинхронный код
-
+
var promise = new Promise(function (resolve, reject) {
fs.readFile('data.json', function (err, data) {
@@ -1574,7 +1578,7 @@ Promises. Асинхронный код
Promises. Асинхронный код
-
+
var promise = new Promise(function (resolve, reject) {
fs.readFile('data.json', function (err, data) {
if (err) {
@@ -1590,7 +1594,7 @@ Promises. Асинхронный код
Promises. Асинхронный код
-
+
var promise = new Promise(function (resolve, reject) {
fs.readFile('data.json', function (err, data) {
if (err) {
@@ -1669,7 +1673,7 @@ Promises. Достоинств
-
+
var promise = new Promise(function (resolve, reject) {
fs.readFile('data.json', function (err, data) {
if (err) {
@@ -1753,7 +1757,9 @@ Чейнинг
function getDefault() {
return { name: 'Sergey' };
}
+
+
function getAvatar (data) {
var name = data.name;
return request('https://my.avatar/' + name);
@@ -1768,6 +1774,14 @@ Чейнинг
style="background: none;" />
+
+
+ - then вернул данные — передаём по цепочке дальше
+ - then вернул промис — передаём результат работы промиса
+ - произошла ошибка — реджектим промис
+
+
+
promise
@@ -1814,14 +1828,6 @@ Чейнинг
promise.then(getAvatar);
-
-
-
- - then вернул данные — передаём по цепочке дальше
- - then вернул промис — передаём результат работы промиса
- - произошла ошибка — реджектим промис
-
-
@@ -1899,8 +1905,8 @@ Почитать
// https://github.com/hakimel/reveal.js#configuration
Reveal.initialize({
controls: false,
- progress: true,
- slideNumber: true,
+ progress: false,
+ slideNumber: false,
history: true,
center: true,
hideAddressBar: true,
diff --git a/08-async/text.txt b/08-async/text.txt
new file mode 100644
index 0000000..f9071cb
--- /dev/null
+++ b/08-async/text.txt
@@ -0,0 +1,119 @@
+[v] 1. Синхронный код. Стек вызовов. Очередь событий [1.1 - 4.10] (10-12 минут)
+[v] 2. Системные таймеры: setTimeout, setInterval, clearInterval [5.1 - 6-13] (8-10 минут)
+[v] 3. Особенности работы системных таймеров. Нулевой интервал [7.1 - 8.6] (7-9 минут)
+[ ] 4. Работа с файлами: синхронное и асинхронное чтение [9.1 - 9.8] (8-10 минут)
+[ ] 5. Использование колбеков для работы с асинхронностью [10.1 - 10.15] (10-12 минут)
+[ ] 6. Промисы. Создание. Использование. Достоинства и недостатки [11.1 - 11.18] (8-10 минут)
+[ ] 7. Цепочки промисов. Параллельность в промисах [12.1 - 13.4] (7-9 минут)
+
+1. Привет. На этой неделе я расскажу вам о том что такое асинхронный код и как
+с ним работать в языке JavaScript.
+
+2. Почти весь код, который мы рассматривали до этой лекции был синхронным,
+а значит мы всегда могли однозначно понять какая функция сейчас выполняется.
+Например, если мы объявим несколько функций который помогут нам приготовить
+кофе и станем вызывать их одну за другой, то мы получим результат в том порядке
+в котором вызывали функции, шаг за шагом.
+
+С асинхронным кодом все немного сложнее. Для того чтобы понять как устроена
+асинхронность в JavaScript'е давайте рассмотрим следующие две темы: стек вызовов
+и очередь событий.
+
+Стек вызовов это структура данных которую использует интерпретатор. Перед тем как
+начать выполнять наш код он помещает в стек анонимную функцию,
+которая содержит код программы. Вызывая эту функцию интерпретатор выполняет код,
+когда весь код отработает функция завершится, то анонимная функция будет
+вытолкнута из стека и наша программа завершит свою работу.
+
+Если на выполняемом участке кода встречается вызов функции то она помещается на
+вершину стека, а интерпретатор начинает работать с ней. В нашем случае при работ
+
+9.1 Ещё один способ записать функцию в очередь событий - это выполнить некоторую
+асинхронную операцию после выполнения которой будет вызван обработчик. В качестве
+таких операций могут выступать операции работы с файлами. Давайте рассмотрим их
+подробнее
+
+Для того чтобы поработать с файловой системой мы подключим встроенный модуль fs
+при помощи функции require. Для того чтобы прочитать файл, который находится в
+той же директории что и файл с нашим кодом мы можем воспользоваться переменной
+__dirname в которой находится абсолютный путь для директории с нашим кодом.
+
+Далее мя производим чтение файла при помощи метода readFileSync бибилиотеки fs
+Первым аргументом функция принимет путь до нужного файла, вторым - кодировку в
+которой нужно проситать файл. Если не указать кодировку то функция вернет буфер
+вместо строки. По завершению чтения мы выведем содердимо файла на консоль.
+
+В данном случае мы воспользовались синхронным методом чтения файла, на это указывает
+суффикс sync. И если мы имеем дело с небольшими файлами такой способ чтения допустим.
+Чтобы определить как долго проиходит операция чтения мы воспользуемся методом time
+и свойства console. Для того чтобы запустить замер времени мы вызовем метод time
+со с произвольной строкой - идентификатором, например readFileSync. Для
+остановки замера вызовем парную функцию timeEnd с таким же идентификатором.
+
+В результате мы увидим на консоли время, в течение которого наш код простаивал.
+В данном слуае это три секуды, наверное это не очень много. Однако, если взять
+файл по-больше то это время увеличиваетс в разы. Например для большого файла bigData.mov
+это время составит аж целых три с половиной секунды. А это значит что всё это время
+наш сервер простаивал, не обрабатывал запросы пользователей и не делал никакой
+другой полезной работы.
+
+...
+
+В этом видео мы подробнее разберем как устроены колбеки, перечислим сильные и
+слабые стороны этого способа работы с асинхронным кодом. Разберем
+когда следует применять этот подход.
+
+Коллбек, или функция обратного вызова в nodejs имеет следующую сигнатуру:
+первый аргумент коллбека это ошибка которая произошла во время выполнения асинхронной
+операции. Если операция выполнилась без ошибки, то в качестве первого аргумента в функцию
+принято передавать null. Вторым аргументов в коллбек передаются данные, которые были
+получены во время выполнения асинхронной операции. Например, в случае чтения
+файла во втором аргументе будет находиться содержимое файла.
+
+Используя коллбеки мы не несем никаких дополнительных накладных расходов,
+это быстрый способ обработать результат асинхронной операции. Помимо этого для
+использования коллбеков нам не понадобится никаких дополнительных библиотек.
+
+Однако, используя коллбеки мы получаем следующий набор недостатков.
+Во-первых, при усложнении асинхронного кода реализованного на коллбеках
+растет уровень вложенности. В данном примере обработчик данных - вывод на
+консоль находится на втором уровне вложенности, однако как только мы заходим
+прочитать два файла последовательно, то обработчик положительного результата
+будет аж на четвертом уровне. И чем сложнее ваш код тем глубже и запутаннее
+становится код.
+
+Во-вторых обработка ошибки и данных, разных по своей природе исходов, приходится
+производить в одном месте что конечно же усложняет код
+
+Промисы
+В этом видео мы рассмотрим с вами ещё один подход для работы с асинхронным кодом
+который называется промисы. Научимся их создавать и навешивать обработчики, которые
+позволят работать с результатами асинхронных операций. Рассмотрим положительные
+и отрицательные стороны этого подхода.
+
+Для того чтобы создать промис нам необходимо вызвать его конструктор при помощи
+с оператором new. Первым аргументов в конструктор промиса необходимо передать
+функцию которая содержит код работы с асинхронным кодом. В случае, если
+
+...
+
+Для того чтобы получить результат работы промиса нуобходимо добавить к нему обработчики
+при помощи вызова метода then. Стоит отметить, что метод then мы можем вызывать
+вне зависимости от того завершился промис или нет.
+
+Первым аргументом в метод then передается кобек, который будет вызван если промис
+завершибся успешно. Если же во время выполнения асинхронной операции произошла
+ошибка, то вызывается колбек который передается в then вторым аргументом.
+В нашем мы можем записать обработчики более компактно, вот так, потому что console.log
+и console.error уже являются функциями.
+
+...
+
+Чейнинг, или объединение промисов в цепочку позволяет описывать сложную
+логику проще.
+
+В прошлом видео мы создали промис и добавили обработчики на результат чтения
+файла при помощи вызова метода then. Давайте разберемся как можно создать простую
+цепочку промисов с той же функциональностью
+
+Рассмотрим следующие функции хелперы которые делают следующее:
diff --git a/css/theme/yandex.css b/css/theme/yandex.css
index 328fda0..d52b6c5 100755
--- a/css/theme/yandex.css
+++ b/css/theme/yandex.css
@@ -60,6 +60,11 @@ body {
.reveal h2 {
font-size: 2.11em; }
+.slide-number {
+ color: white;
+ font-size: 16px !important;
+}
+
.reveal h3 {
font-size: 1.55em; }