В этой статье я представлюES2017
изasync
Почему функцияES2016
изGenerators
а такжеPromises
Синтаксический сахар для функций функций.
Чтение инструкций
- В этой статье не вводятся и не объясняются три понятия
- Единственная цель этой статьи — описать, как использовать
Generators
а такжеPromises
реализоватьasync
- Эта статья о
async
и другие подобные реализации не оцениваются на предмет плюсов и минусов - Коды в этой статье умно разработаны для легкого понимания, они не подходят для реальной разработки.
Зачем?
теперь, когдаasync
Функция нативно поддерживается, надо разбираться как она работает?
Что ж, помимо любопытства о том, как это работает, важнее поддерживать старые платформы. Если вы хотите, чтобы код, использующий новые функции, работал в старых версиях браузера иNode.js
версия, вам может понадобиться использовать что-то вродеBabel
Такой инструмент для преобразования этих новых функций.
Поэтому глубокое пониманиеasync
Как функции разлагаются наgenerators
а такжеpromises
Позже это может быть очень полезно при чтении или отладке преобразованного кода. Например, это простойasync
функция:
одеялоBabel
Перевести вES2016
Код выглядит следующим образом (не совсем понял его, он будет объяснен ниже):
Разница была велика! Конечно, если вы понимаетеasync
работает, то этот преобразованный код вам не составит труда.
Еще один интересный факт заключается в том, что браузеры такжеasync
Функция для реализации: как в браузереBabel
использовать то же самоеgenerators
а такжеpromises
идтиконвертироватьasync
.
Так что именно произошло?
Иногда лучший способ понять, как что-то работает, — это сделать это самому.
Например, у нас есть раздел, использующий
async
Фрагмент кода функции, как мы можем воспользоватьсяgenerators
а такжеpromises
переписать его?
это нашеasync
функция:
В теле функции последовательно выполняются три асинхронные задачи, и каждая задача зависит от завершения предыдущей задачи. Наконец, функция возвращает результат последней задачи.
как использоватьgenerators
переписать
Функция генератора такова: можно выйти и снова войти.让我们快速回顾一下它的工作方式,以下是一个简单的generator
функция:
эта генераторная функцияgen
имеет некоторые интересные особенности (отMDNизвлекать):
- когда
generator
Функция вызывается, а код внутри функции нене выполняется сразу. Он возвращает последовательныйпротокол итератораиз迭代器
объект: он имеетnext
метод - воплощать в жизнь
gen
Единственный способ для кодирования внутри функции находится в возврате迭代器
вызов на объектnext
метод. каждый звонокnext
, код в теле функции выполняется доyield
выражение, выражение右值
назначить на迭代器
. -
next
Методы также могут принимать параметры, вызов с параметрами заменит предыдущий вызов значением параметра.yield
выразительный左值
А затем выполнить и вернуть текущийyield
выразительный右值
const a = yiled foo();
// | |
// | |
// 左值 右值
Пожалуйста, внимательно ознакомьтесь с приведенными выше шагами или обратитесь кДокументация MDN.
Как эти функции помогают нам?
К настоящему времени вы, возможно, задаетесь вопросом,generator
Как функция выражает цель этой статьи?
Нам нужно смоделировать асинхронный рабочий процесс: то есть, когда нам нужно перейти к следующему шагу, мы должны дождаться завершения конкретной задачи.
Но до сих пор все, что мы обсуждали, было синхронным. Как сделать?
Примечание переводчика: вышеизложенное
yield
Выражения сопровождаются синхронизированными значениями
Функция генератора ключей может быть
promises
провестиyield
Одинgenerator
Функция можетpromise
провестиyield
, и это迭代器
Можно управлять, чтобы остановиться и подождатьpromise
наконецresolve
илиreject
И переходим к следующему шагу со значением их разрешения. Эта конструкция можетyield promises
Шаблон итератора для удовлетворения наших потребностей:
Мы только на полпути так далеко. Нам нужен метод, который выполняет содержимое функционального тела, нам нужен метод, который может контролироватьgenerator
функция迭代器
функция, которая останавливается и ждет каждогоyield promise
результат решения. Это звучит сложно, но это довольно просто реализовать:
Теперь мы можем использовать его, как показано ниже.runner
функция выполняет нашу функцию генератораinit
:
Это так просто!runner
функция иinit
Комбинированное использование функций достигает нативного уровняasync
эффект функции.
Пожалуйста, помните этоrunner
Функция представляет собой просто демонстрационный код для объяснения цели этой статьи, она не подходит для реальных сценариев разработки, если вам нужна подходящая реализация, вы можетездесьСмотреть.
Суммировать
мы начинаем сasync
функцию, а затем использоватьgenerators
а такжеpromises
Для достижения той же функции:
Углубленная практика
-
В начале этой статьи мы видим
Babel
БудуES2017
изasync
После преобразования функции, как использоватьES2016
изgenerators
а такжеpromises
достигать. Вы можете посмотреть перед преобразованием после_asyncToGenerator
функции, сравните нашиrunner
函数就会发现两者很相似。 Фактически,_asyncToGenerator
Функция у нас тут предельно простаяrunner
Надежная версия функции -
Если вы все еще заинтересованы, вы можете выполнить следующий шаг исследования, который заключается в том, чтобы поставить
async
функция преобразуется в нетgenerators
изES2015
Версия кода. Поэтому вам может понадобиться смоделироватьgenerators
себя (см.regenerator project)
Я надеюсь ткать через эту статьюasync
Туман функций, обеспечивающий простой синтаксис и уменьшающий шум кода.async
Предложение функции описывается следующим образом:
благодарныйAkos, Alisaтак же какKristianОтзыв, предоставленный для улучшения этой статьи.