|
20 | 20 | аргументов, а если функция имеет еще и callback, то нужно перехватывать и его,
|
21 | 21 | тоже логируя в файл момент, вызова callback. Это задание можно разбить на
|
22 | 22 | несколько шагов.
|
23 |
| - |
24 | 23 | 2. Удаляем из `application.js` вызов таймера и оставляем там только код:
|
25 |
| -```JavaScript |
26 |
| -var fileName = './README.md'; |
27 |
| -console.log('Application going to read ' + fileName); |
28 |
| -fs.readFile(fileName, function(err, src) { |
29 |
| - console.log('File ' + fileName + ' size ' + src.length); |
30 |
| -}); |
31 |
| -``` |
| 24 | + |
| 25 | + ```JavaScript |
| 26 | + var fileName = './README.md'; |
| 27 | + console.log('Application going to read ' + fileName); |
| 28 | + fs.readFile(fileName, function(err, src) { |
| 29 | + console.log('File ' + fileName + ' size ' + src.length); |
| 30 | + }); |
| 31 | + ``` |
32 | 32 | Это пример работы с файлом. И мы будем изменять поведение этого кода.
|
33 | 33 | Убираем из `framework.js` обертку таймера и пробрасываем `fs` в приложение.
|
34 | 34 | Теперь запускаем `node framework` и убеждаемся, что файл считывается и
|
35 | 35 | выводится его длина.
|
36 |
| - |
37 | 36 | 3. Теперь пишем функцию `cloneInterface(interfaceName)` для копирования всех
|
38 | 37 | ключей из библиотеки `fs` в новый интерфейс и передаем в песочницу не исходный
|
39 | 38 | `fs`, а склонированный. Пример функции клонирования:
|
40 |
| -```JavaScript |
41 |
| -function cloneInterface(anInterface) { |
42 |
| - var clone = {}; |
43 |
| - for (var key in anInterface) { |
44 |
| - clone[key] = anInterface[key]; |
45 |
| - } |
46 |
| - return clone; |
47 |
| -} |
48 |
| -``` |
49 | 39 |
|
| 40 | + ```JavaScript |
| 41 | + function cloneInterface(anInterface) { |
| 42 | + var clone = {}; |
| 43 | + for (var key in anInterface) { |
| 44 | + clone[key] = anInterface[key]; |
| 45 | + } |
| 46 | + return clone; |
| 47 | + } |
| 48 | + ``` |
50 | 49 | 4. Пишем функцию `wrapFunction(fnName, fn)` которая оборачивает функцию `fn` и
|
51 | 50 | возвращает функцию-замыкание от `wrapper`. Замыкание, это ссылка на копию
|
52 | 51 | функции `wrapper`, которая замкнута на контекст `wrapFunction`. Таким образом
|
53 | 52 | мы применяем функциональное наследование и порождаем такой вариант `wrapper`,
|
54 | 53 | который видит параметры `fnName` и 'fn' от `wrapFunction`. Мы полностью
|
55 |
| -передаем все аргументы в функцию fn. |
56 |
| -```JavaScript |
57 |
| -function wrapFunction(fnName, fn) { |
58 |
| - return function wrapper() { |
59 |
| - var args = []; |
60 |
| - Array.prototype.push.apply(args, arguments); |
61 |
| - console.log('Call: ' + fnName); |
62 |
| - console.dir(args); |
63 |
| - fn.apply(undefined, args); |
64 |
| - } |
65 |
| -} |
66 |
| -``` |
| 54 | +передаем все аргументы в функцию fn: |
67 | 55 |
|
| 56 | + ```JavaScript |
| 57 | + function wrapFunction(fnName, fn) { |
| 58 | + return function wrapper() { |
| 59 | + var args = []; |
| 60 | + Array.prototype.push.apply(args, arguments); |
| 61 | + console.log('Call: ' + fnName); |
| 62 | + console.dir(args); |
| 63 | + fn.apply(undefined, args); |
| 64 | + } |
| 65 | + } |
| 66 | + ``` |
68 | 67 | 5. Определяем, есть ли среди аргументов `callback`, он всегда последний в
|
69 | 68 | массиве аргументов и его тип `function`. Если `callback` есть, то вместо него
|
70 | 69 | передаем свою функцию, которая логирует все аргументы и вызывает настояций
|
71 | 70 | `callback`.
|
72 |
| - |
73 | 71 | 6. Теперь можно из `application.js` использовать другие функции `fs` и
|
74 | 72 | убедиться, что все они обернуты.
|
75 |
| - |
76 | 73 | 7. Добавляем таймеры в `application.js` и на таймерах работаем с файлами, а из
|
77 | 74 | `framework.js` собираем статистику работы с файлами и выводим ее каждые 30
|
78 | 75 | секунд. Например, можно соирать несколько из этих параметров
|
79 |
| -- количество обращений к функциям, |
80 |
| -- количество колбэков, |
81 |
| -- среднюю скорость завершения функций, |
82 |
| -- среднюю скорость возвращения колбеков, |
83 |
| -- общий объем прочитанных с диска данных, |
84 |
| -- общий объем записанных данных, |
85 |
| -- среднюю скорость чтения и записи, |
86 |
| -и т.д. |
| 76 | + - количество обращений к функциям, |
| 77 | + - количество колбэков, |
| 78 | + - среднюю скорость завершения функций, |
| 79 | + - среднюю скорость возвращения колбеков, |
| 80 | + - общий объем прочитанных с диска данных, |
| 81 | + - общий объем записанных данных, |
| 82 | + - среднюю скорость чтения и записи, |
| 83 | + и т.д. |
87 | 84 |
|
88 | 85 | Сохраните наработки этой лабораторной работы, они понадобятся для выполнения
|
89 | 86 | следующих работ, в частности, работы по передаче вызовов в другой процесс и
|
|
0 commit comments