HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Асинхронное программирование помогает эффективно использовать вычислительные ресурсы. Но создает сложности там, где изначально было просто. В первую очередь это касается<strong>порядка выполнения</strong>(flow). Предположим, что перед нами стоит задача прочитать содержимое двух файлов и записать в третий (объединение файлов).</p>
1 <p>Асинхронное программирование помогает эффективно использовать вычислительные ресурсы. Но создает сложности там, где изначально было просто. В первую очередь это касается<strong>порядка выполнения</strong>(flow). Предположим, что перед нами стоит задача прочитать содержимое двух файлов и записать в третий (объединение файлов).</p>
2 <p>Вся задача сводится к последовательному выполнению трёх операций, так как записать новый файл мы можем лишь тогда, когда прочитаем данные первых двух. Упорядочить подобный код можно лишь одним способом: каждая последующая операция должна запускаться внутри колбека предыдущей. Тогда мы построим нужную цепочку вызовов:</p>
2 <p>Вся задача сводится к последовательному выполнению трёх операций, так как записать новый файл мы можем лишь тогда, когда прочитаем данные первых двух. Упорядочить подобный код можно лишь одним способом: каждая последующая операция должна запускаться внутри колбека предыдущей. Тогда мы построим нужную цепочку вызовов:</p>
3 <p>В реальных программах количество операций может быть значительно больше: например, десятки - и тогда у вас получится лесенка из 10-и вложенных вызовов. Подобное свойство асинхронного кода нередко называют<em>Callback Hell</em>("ад колбеков") из-за большого числа вложенных колбеков, которые очень затрудняют анализ программы. Кто-то даже сделал сайт<a>http://callbackhell.com/</a>, на котором разбирается эта проблема и приводится вот такой код:</p>
3 <p>В реальных программах количество операций может быть значительно больше: например, десятки - и тогда у вас получится лесенка из 10-и вложенных вызовов. Подобное свойство асинхронного кода нередко называют<em>Callback Hell</em>("ад колбеков") из-за большого числа вложенных колбеков, которые очень затрудняют анализ программы. Кто-то даже сделал сайт<a>http://callbackhell.com/</a>, на котором разбирается эта проблема и приводится вот такой код:</p>
4 <p>В некоторых случаях заранее неизвестно, сколько надо будет выполнить операций. Например, может понадобиться прочитать содержимое директории и посмотреть, кто владелец каждого файла (его<em>uid</em>). Если бы код был синхронный, то наше решение выглядело бы так:</p>
4 <p>В некоторых случаях заранее неизвестно, сколько надо будет выполнить операций. Например, может понадобиться прочитать содержимое директории и посмотреть, кто владелец каждого файла (его<em>uid</em>). Если бы код был синхронный, то наше решение выглядело бы так:</p>
5 <p>Последовательный код прост и понятен, каждая следующая строчка выполняется после того, как закончится предыдущая, а в map каждый элемент обрабатывается гарантированно последовательно.</p>
5 <p>Последовательный код прост и понятен, каждая следующая строчка выполняется после того, как закончится предыдущая, а в map каждый элемент обрабатывается гарантированно последовательно.</p>
6 <p>С асинхронным кодом возникают вопросы. И если чтение директории - операция, которую мы сделаем в любом случае, то как описать анализ файлов, ведь их может быть любое количество. К сожалению, без использования готовых абстракций, упрощающих данную задачу, мы получим много сложного кода. Настолько сложного, что в реальной жизни так лучше никогда не делать, этот код приводится только в образовательных целях.</p>
6 <p>С асинхронным кодом возникают вопросы. И если чтение директории - операция, которую мы сделаем в любом случае, то как описать анализ файлов, ведь их может быть любое количество. К сожалению, без использования готовых абстракций, упрощающих данную задачу, мы получим много сложного кода. Настолько сложного, что в реальной жизни так лучше никогда не делать, этот код приводится только в образовательных целях.</p>
7 <p>Общий принцип такой: формируется специальная функция (readFileStat), которая рекурсивно вызывается, передавая себя в функцию stat. С каждым новым вызовом она отрабатывает один файл и уменьшает массив items, в котором содержатся еще необработанные файлы. Вторым параметром она аккумулирует (собирает) получившийся результат, который в конце передаётся в колбек cb (переданный вторым аргументом функции getFileOwners). Пример выше реализует<a>итеративный процесс, построенный на рекурсивных функциях</a>. Чтобы лучше понять код выше, попробуйте скопировать его к себе на компьютер и позапускайте с разными аргументами, предварительно расставив отладочный вывод внутри неё.</p>
7 <p>Общий принцип такой: формируется специальная функция (readFileStat), которая рекурсивно вызывается, передавая себя в функцию stat. С каждым новым вызовом она отрабатывает один файл и уменьшает массив items, в котором содержатся еще необработанные файлы. Вторым параметром она аккумулирует (собирает) получившийся результат, который в конце передаётся в колбек cb (переданный вторым аргументом функции getFileOwners). Пример выше реализует<a>итеративный процесс, построенный на рекурсивных функциях</a>. Чтобы лучше понять код выше, попробуйте скопировать его к себе на компьютер и позапускайте с разными аргументами, предварительно расставив отладочный вывод внутри неё.</p>