|
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