т.е. как я могу выразить это:
function *(next) {}
со стрелками Я перепробовал все комбинации, которые мог придумать, и не могу найти никакой документации по этому вопросу.
(в настоящее время используется узел v0.11.14)
javascript
ecmascript-6
generator
arrow-functions
Эшли Кулман
источник
источник
function*
Оператор (ключевое слово функции, за которым следует звездочка) определяет функцию генератора».param*=>{ }
сделать?function(){}
не делает так же, как()=>{}
?Ответы:
Ты не можешь Сожалею.
По данным МДН
Из спецификации документа (мой акцент):
источник
.prototype
например) и часто однострочными, в то время как генераторы в значительной степени противоположны.this
, и мне пришлось написатьlet self = this
хак, чтобы получить доступ к нему внутри генератора. Синтаксис лексической области видимости + стрелки был бы хорош. К сожалению, но не совсем конец света.function
ключевое слово в «плохую часть» языка. Есть веские причины для этого. Для этих людей отсутствие стрелочных генераторов является досадным несоответствием.Разница между Inline-функциями и Arrow-функциями
Прежде всего Arrow-функции
() => {}
не предназначены для замены Inline-функций,function(){}
и они разные. Inline-функции - это просто функции, поэтому вопрос в том, в чем разница между функциями Arrow и Inline-функциями.Еще несколько быстрых подробностей здесь
Почему Arrow-функция не может быть использована в качестве генератора
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Обратите внимание, что генераторы без
yield
не имеют смысла.Почему Arrow-функция не может использовать yield
http://tc39wiki.calculist.org/es6/arrow-functions/
Выход в функции со стрелкой вызовет семантическую ошибку: http://www.ecma-international.org/
В конце концов, причина кроется в глубокой сложности внедрения ECMA6. C # не допускает этого также по несколько схожим причинам .
источник
()=>{}
очень помогло бы понять его отличие от встроенной функции, и почему существует ограничение для генераторов.*() => { yield bla; }
не в порядке, ноasync () => { await bla; }
это ...В дополнение к обсуждению на esdiscuss.org и примечаниям к заседаниям комитета ES6 TCM Ecma за ноябрь 2013 года, упомянутым выше, стрелки генератора были вновь рассмотрены на двух совещаниях ES7 в сентябре 2016 года [1] [2] . После обсуждения плюсов и минусов различных синтаксисов (в основном
=*>
и=>*
) и отсутствия обоснований и вариантов использования этой функции они пришли к выводу, что:Предложение генераторов стрел было перенесено на стадию 1 с Бренданом Эйчем и Домеником Дениколой в качестве чемпионов. Упомянутая выше асинхронная итерация была завершена и реализована в 2018 году.
В октябре 2019 года появилось официальное репо Сергея Рубанова с подробным обсуждением синтаксиса и других деталей.
источник
У меня тоже был такой же вопрос и я пришел сюда. После прочтения постов и комментариев я почувствовал, что использование генератора в функции со стрелкой выглядит расплывчато:
Это может быть главной причиной того, что они не реализовали генератор в связи с функцией стрелки.
Но если бы я был одним из них, я мог бы подумать так:
Это похоже на то, что у нас есть асинхронная функция:
Потому что с нормальной функцией асинхронный существует ключевое слово , поэтому функция стрелки его использует -
async () =>
скорее всего, покажетсяasync function()
.Но нет такого ключевого слова, как
gen
or,generator
и, увы, функция стрелки его не использует.Заключить:
Даже если они хотят реализовать генератор в функции стрелки, я думаю, что им нужно пересмотреть синтаксис генератора в ядре js:
И это будет большой ошибкой. Таким образом, держать стрелку подальше от генератора довольно круто.
После комментария @Bergi :
Я скажу, что целью генератора является запуск-остановка-запуск, и поэтому я не думаю, что нам нужно заботиться о прототипе, лексическом этом и т. Д.
источник
() ~> { yield 'a'; yield 'b'; }
. Если честно, я просто люблю тильды.Я знаю, что это очень поздно, но другой возможной причиной может быть синтаксис. возможно
(*() => {})
работает, а как же(9 ** () => {})
? Возвращает ли это 9 к степени функции стрелки,NaN
или же функция возврата стрелки 9 раз тожеNaN
? Это может быть сделано с помощью некоторого альтернативного синтаксиса, например,=>*
как уже упоминалось в другом ответе, но, возможно, было желание сохранить согласованность синтаксиса функции генератора (например,function* () {}
и{ *genMethod() {} }
) при его реализации. Не слишком оправдание, но причина для этого.источник
Прямо сейчас вы не можете, но в будущем вы можете быть, потому что предложение TC39 для того же в октябре 2019 года, который находится на этапе 1.
источник
Есть хороший обходной путь с Redx-сага
источник