diff --git a/README.russian.md b/README.russian.md index c6f0e94d..ecebec75 100644 --- a/README.russian.md +++ b/README.russian.md @@ -118,7 +118,7 @@ **Иначе:** Стиль обратного вызова Node.js, функция (err, response), является многообещающим способом создания непригодного для использования кода из-за сочетания обработки ошибок со случайным кодом, чрезмерных вложений и слабых шаблонов кодирования. -🔗 [**Подробнее: уход от обратных вызовов**](/section/errorhandling/asyncerrorhandling.md) +🔗 [**Подробнее: Используйте Async-Await или обещания для асинхронной обработки ошибок**](/section/errorhandling/asyncerrorhandling.russian.md)

diff --git a/sections/errorhandling/asyncerrorhandling.russian.md b/sections/errorhandling/asyncerrorhandling.russian.md new file mode 100644 index 00000000..4d0dcda5 --- /dev/null +++ b/sections/errorhandling/asyncerrorhandling.russian.md @@ -0,0 +1,78 @@ +# Используйте Async-Await или обещания для асинхронной обработки ошибок + +### Объяснение в один абзац + +Обратные вызовы плохо масштабируются, так как большинство программистов не знакомы с ними. Они заставляют проверять ошибки повсюду, имеют дело с неприятным вложением кода и затрудняют анализ потока кода. Библиотеки Promise, такие как BlueBird, async и Q, упаковывают стандартный стиль кода, используя RETURN и THROW для управления потоком программы. В частности, они поддерживают любимый стиль обработки ошибок try-catch, который позволяет освободить путь к основному коду от ошибок в каждой функции + +### Пример кода – использование обещаний для отлова ошибок + +```javascript +return functionA() + .then((valueA) => functionB(valueA)) + .then((valueB) => functionC(valueB)) + .then((valueC) => functionD(valueC)) + .catch((err) => logger.error(err)) + .then(alwaysExecuteThisFunction()) +``` + +### Пример кода - использование async/await для отлова ошибок + +```javascript +async function executeAsyncTask () { + try { + const valueA = await functionA(); + const valueB = await functionB(valueA); + const valueC = await functionC(valueB); + return await functionD(valueC); + } + catch(err) { + logger.error(err); + } +} +``` + +### Пример кода шаблона - обработка ошибок в стиле обратного вызова + +```javascript +getData(someParameter, function(err, result) { + if(err !== null) { + // do something like calling the given callback function and pass the error + getMoreData(a, function(err, result) { + if(err !== null) { + // do something like calling the given callback function and pass the error + getMoreData(b, function(c) { + getMoreData(d, function(e) { + if(err !== null ) { + // you get the idea?  + } + }) + }); + } + }); + } +}); +``` + +### Цитата из блога: "У нас проблема с обещаниями" + +Из блога pouchdb.com + +> … На самом деле, обратные вызовы делают что-то еще более зловещее: они лишают нас стека, что мы обычно принимаем как должное в языках программирования. Написание кода без стека очень похоже на вождение автомобиля без педали тормоза: вы не понимаете, насколько сильно оно вам нужно, пока не дойдете до него, а его там нет. Весь смысл обещаний состоит в том, чтобы вернуть нам языковые основы, которые мы потеряли при асинхронности: возврат, выброс и стек. Но вы должны знать, как правильно использовать обещания, чтобы воспользоваться ими. + +### Цитата блога: "Метод обещаний гораздо более компактен" + +Из блога gosquared.com + +> … Метод обещаний гораздо компактнее, понятнее и быстрее для написания. Если ошибка или исключение происходят в любом из операций, они обрабатываются одним обработчиком .catch(). Наличие единого места для обработки всех ошибок означает, что вам не нужно писать проверку ошибок для каждого этапа работы. + +### Цитата блога: "Обещания являются родными ES6, могут использоваться с генераторами" + +Из блога StrongLoop + +> … Обратные вызовы имеют паршивую историю обработки ошибок. Обещания лучше. Объедините встроенную обработку ошибок в Express с обещаниями и значительно снизьте вероятность возникновения необработанного исключения. Обещания являются родными ES6, могут использоваться с генераторами, а предложения ES7, такие как async/await, через компиляторы, такие как Babel. + +### Цитата из блога: "Все те обычные конструкции управления потоком, к которым вы привыкли, полностью разрушены" + +Из блога Бенно + +> … Одно из лучших преимуществ асинхронного программирования на основе обратного вызова состоит в том, что в основном все эти обычные конструкции управления потоком, к которым вы привыкли, полностью разрушены. Тем не менее, я считаю, что больше всего разрушения коснулись обработки исключений. Javascript предоставляет довольно знакомую конструкцию try…catch для работы с исключениями. Проблема с исключениями состоит в том, что они обеспечивают отличный способ сокращения ошибок в стеке вызовов, но в конечном итоге оказываются совершенно бесполезными, если ошибка происходит в другом стеке…