Я слышал о ключевом слове yield в JavaScript, но нашел очень плохую документацию по нему. Может ли кто-нибудь объяснить мне (или порекомендовать сайт, который объясняет) его использование и для чего он используется?
javascript
yield
keyword
mck89
источник
источник
Ответы:
Документация по MDN довольно хорошая, IMO.
источник
Поздний ответ, наверное, все знают об этом
yield
сейчас, но пришла лучшая документация.Адаптируем пример из «Будущего Javascript: Генераторы» Джеймса Лонга для официального стандарта Harmony:
Так
yield
что вродеreturn
: ты что-то получаешь.return x
возвращает значениеx
, ноyield x
возвращает функцию, которая дает метод для итерации к следующему значению. Полезно, если у вас есть потенциально ресурсоемкая процедура, которую вы можете прервать во время итерации.источник
function* foo(x){
здесь*
токен . Нужно вам это или нет, зависит от того, какое будущее вы возвращаете. Детали длинные: GvR объясняет это для реализации Python , на которой смоделирована реализация Javascript. Использованиеfunction *
всегда будет правильным, хотя в некоторых случаях немного больше накладных расходов, чемfunction
сyield
.function *
иyield
и добавила указанную ошибку («Ранняя ошибка возникает, если в функции, не являющейся генератором, возникает выражение yield или yield *»). Но оригинальная реализация Javascript 1.7 в Firefox не требовала*
. Обновил ответ соответственно. Спасибо!Это действительно просто, вот как это работает
yield
Ключевое слово просто помогает приостановить и возобновить функцию в любое время асинхронно .Возьмите эту простую функцию генератора :
Пока вы не вызовете _process.next (), он не будет выполнять первые 2 строки кода, а затем первый выход приведет к приостановке функции. Чтобы возобновить функцию до следующей точки паузы ( ключевого слова yield ), вам нужно вызвать _process.next () .
Но в то время как yield выполняет эту паузу и возобновляет поведение, он также может возвращать некоторые результаты в
{value: any, done: boolean}
соответствии с предыдущей функцией, у нас нет значений. Если мы рассмотрим предыдущий вывод, он покажет то же самое{ value: undefined, done: false }
со значением undefined .Давайте перейдем к ключевому слову yield. При желании вы можете добавить выражение и установить присвоить значение по умолчанию . (Официальный синтаксис документа)
выражение : значение, возвращаемое из функции генератора
rv : возвращает необязательное значение, переданное методу next () генератора
Попробуй это сейчас
Обычаи
Ссылки:
источник
Упрощая / развивая ответ Ника Сотироса (который я считаю удивительным), я думаю, что лучше всего описать, как можно начать кодировать с
yield
.На мой взгляд, самое большое преимущество использования
yield
является то, что оно устранит все проблемы вложенных обратных вызовов, которые мы видим в коде. Трудно понять, как сначала, поэтому я решил написать этот ответ (для себя и, надеюсь, других!)То, как это происходит, заключается в представлении идеи сопрограммы, которая является функцией, которая может добровольно останавливаться / останавливаться, пока не получит то, что ей нужно. В javascript это обозначено как
function*
. Толькоfunction*
функции могут использоватьyield
.Вот несколько типичных JavaScript:
Это неуклюже, потому что теперь весь ваш код (который, очевидно, должен ждать этого
loadFromDB
вызова) должен быть внутри этого уродливого обратного вызова. Это плохо по нескольким причинам ...})
который нужно отслеживать вездеfunction (err, result)
жаргонresult
С другой стороны,
yield
все это можно сделать в одну строку с помощью удобной сопрограммы.И теперь ваша основная функция будет работать там, где это необходимо, когда ей нужно ждать загрузки переменных и вещей. Но теперь, чтобы запустить это, вам нужно вызвать нормальную функцию (не сопрограмму). Простая сопрограммная среда может решить эту проблему, так что все, что вам нужно сделать, это запустить это:
И начало определено (из ответа Ника Сотиро)
И теперь у вас может быть красивый код, который будет гораздо более читабельным, легко удаляемым, и вам не нужно возиться с отступами, функциями и т. Д.
Интересное наблюдение заключается в том, что в этом примере
yield
это просто ключевое слово, которое можно поставить перед функцией с обратным вызовом.Напечатал бы "Hello World". Таким образом, вы можете превратить любую функцию обратного вызова в использование
yield
, просто создав одну и ту же сигнатуру функции (без cb) и вернув ееfunction (cb) {}
, вот так:Надеемся, что благодаря этим знаниям вы сможете написать более понятный и читаемый код, который легко удалить !
источник
function*
обычная функция без выхода?function *
это функция, которая содержит доходность. Это специальная функция, называемая генератором.yield
везде, я уверен, что это имеет больше смысла, чем обратные вызовы, но я не вижу, как это более читабельно, чем обратные вызовы.Чтобы дать полный ответ:
yield
работает аналогичноreturn
, но в генераторе.Что касается обычно данного примера, это работает следующим образом:
Но есть и вторая цель ключевого слова yield. Может использоваться для отправки значений в генератор.
Чтобы уточнить, небольшой пример:
Это работает, поскольку значение
2
присваиваетсяy
путем отправки его генератору после того, как он остановился на первом выходе (который вернул0
).Это позволяет нам делать действительно интересные вещи. (ищите сопрограмму)
источник
Используется для генераторов итераторов. По сути, это позволяет вам создать (потенциально бесконечную) последовательность, используя процедурный код. Смотрите документацию Mozilla .
источник
yield
также может быть использован для устранения обратного вызова ада, с сопрограммой каркаса.источник
Генератор последовательности Фибоначчи с использованием ключевого слова yield.
источник
Yeild
ключевое слово в функции javaScript делает его генератором,что такое генератор в javaScript?
Генераторы значений помогают нам работать асинхронно с помощью итераторов. А теперь, что за хакерские итераторы? действительно?
откуда итератор помогает нам получить доступ к элементу по одному за раз? это помогает нам получить доступ к элементам через функции генератора,
Функции генератора - это те, в которых мы используем
yeild
ключевое слово, а ключевое слово yield помогает нам в приостановке и возобновлении выполнения функции.вот быстрый пример
позвольте мне кратко объяснить, что происходит
вы заметили, что выполнение приостановлено для каждого
yeild
ключевого слова, и мы можем получить доступ сначалаyield
с помощью итератора.next()
это повторяет все
yield
ключевые слова по одному, а затем возвращает неопределенное значение, когда больше не осталосьyield
ключевых слов в простых словах, которые вы можете сказатьyield
ключевое слово является точкой останова, где функция каждый раз останавливается и возобновляется только при вызове с использованием итераторадля нашего случая:
_getMeDrink.next()
это пример итератора, который помогает нам получить доступ к каждой точке останова в функцииПример генераторов:
async/await
если вы видите реализацию
async/await
вы увидитеgenerator functions & promises
, используются, чтобы сделатьasync/await
работупожалуйста, укажите любые предложения приветствуется
источник
Зависимость между асинхронными вызовами JavaScript.
Еще один хороший пример того, как можно использовать урожай.
источник
Прежде чем вы узнаете о доходности, вы должны знать о генераторах. Генераторы создаются с использованием
function*
синтаксиса. Функции генератора не выполняют код, а вместо этого возвращают тип итератора, называемый генератором. Когда значение дается с помощьюnext
метода, функция генератора продолжает выполняться, пока не встретит ключевое слово yield. Использованиеyield
возвращает объект, содержащий два значения: одно значение, а другое готово (логическое значение). Значение может быть массивом, объектом и т. Д.источник
Простой пример:
источник
Я также пытаюсь понять ключевое слово yield. Исходя из моего текущего понимания, в генераторе ключевое слово yield работает как переключатель контекста процессора. Когда выполняется оператор yield, все состояния (например, локальные переменные) сохраняются.
Кроме того, объект прямого результата будет возвращен вызывающей стороне, например, {value: 0, done: false}. Вызывающий объект может использовать этот объект результата, чтобы решить, следует ли снова «разбудить» генератор, вызвав next () (вызов next () должен выполнить итерацию выполнения).
Еще одна важная вещь заключается в том, что он может установить значение для локальной переменной. Это значение может быть передано вызывающей функцией next () при «пробуждении» генератора. например, it.next ('valueToPass'), например: "resultValue = yield slowQuery (1);" Так же, как при пробуждении следующего выполнения, вызывающая сторона может ввести какой-либо результат выполнения в выполнение (вставив его в локальную переменную). Таким образом, для этого выполнения существует два вида состояния:
контекст, сохраненный в последнем исполнении.
Введенные значения триггером этого выполнения.
Таким образом, с помощью этой функции генератор может сортировать несколько асинхронных операций. Результат первого асинхронного запроса будет передан второму путем установки локальной переменной (resultValue в примере выше). Второй асинхронный запрос может быть вызван только ответом первого асинхронного запроса. Затем второй асинхронный запрос может проверить значение локальной переменной, чтобы решить следующие шаги, поскольку локальная переменная является введенным значением из ответа первого запроса.
Трудности асинхронных запросов:
ад обратного вызова
потеря контекста, если не передать их в качестве параметров в обратном вызове.
yield и генератор могут помочь в обоих случаях.
Без yield и генератора для сортировки нескольких асинхронных запросов требуется вложенный обратный вызов с параметрами в качестве контекста, который нелегко читать и поддерживать.
Ниже приведен пример цепочки асинхронных запросов, выполняющихся с помощью nodejs:
Ниже приведен результат выполнения:
+++++++++++ начать +++++++++++
query1 0
+++++++++++ конец +++++++++++
query2 1
query4 0
Шаблон состояния ниже может сделать то же самое для приведенного выше примера:
Ниже приводится результат выполнения:
+++++++++++ начать +++++++++++
query1 0
+++++++++++ конец +++++++++++
query2 1
query4 0
источник
не забывайте очень полезный синтаксис «x of generator» для обхода генератора. Нет необходимости использовать функцию next () вообще.
источник