Page 246 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 246
обратного вызова с первым аргументом для передачи ошибки в стиле Node) с насто
ящим (обязательства), а функция grun обеспечивает доступ к будущему уже сегодня
(в спецификации ES7 ожидается ключевое слово awai t, которое будет, по существу,
функцией grun с еще более естественным синтаксисом). Т е перь, когда самая трудная
часть закончена, давайте посмотрим, как все это упрощает нашу жизнь.
Помните наш псевдокод "разве не было бы хорошо" ранее в этой главе? Теперь
мы можем его реализовать.
function* theFuturei sNow ( )
i
t
const dataA yield nfcall ( f . readF l e , ' а . tx ' ) ;
s
const dataB = yield nfcall ( f s . readFile , ' b . t x ' ) ;
t
const dataC = yield nfcall ( f s . readFile , ' c . t x ' ) ;
t
yield ptimeout ( 6 0 * 1 0 0 0 ) ;
yield nfcall ( fs . writeFile , ' d . tx ' , dataA+dataB+dataC) ;
t
Выглядит намного лучше, чем проклятье обратных вызовов, не так ли? Это куда
аккуратнее, чем одни только обязательства, и напоминает способ, которым мы дума
ем. Используется это так же просто.
grun ( theFuture i s Now) ;
Ша г вперед и два назад ?
Вы могли бы (и весьма резонно) полагать, что мы зашли в такие глубокие деб
ри, только чтобы понять природу асинхронного выполнения и сделать все проще."
а теперь мы вернулись к тому, с чего начали, кроме дополнительных сложностей
с генераторами и преобразованием всего в обязательства, а также функции grun.
И в этом есть некоторая доля правды: в нашей функции theFutureisNow ребенка
выплеснули с грязной водой несколько раз. Мы добились достаточно простого в на
писании и чтении кода. Но мы получили лишь часть преимуществ от асинхронного
выполнения, но не их все. Здесь вполне резонен вопрос ''А не было бы эффективнее
читать эти три файла параллельно?" Ответ на этот вопрос зависит от конкретной
задачи, реализации вашего движка JavaScript, вашей операционной системы и вашей
файловой системы. Но давайте отложим эти сложности на мгновение и уясним, что
не имеет значения, в каком порядке мы будем читать эти три файла, и что выигрыш
в эффективности зависит от способности выполнения операций чтения файлов па
раллельно операционной системой. Именно здесь пускатели генераторов могут соз
дать иллюзию ложной простоты: ведь мы написали функцию именно в таком стиле
только потому, что этот путь казался нам простым и очевидным.
Проблема (предположим, что это проблема) решается просто. В классе Promise
есть метод l l , который будет завершен (resolves), когда будут завершены (resolve)
a
все обязательства в массиве". и выполняет асинхронный код параллельно, если это
Генераторы 249

