it-swarm.com.ru

Могу ли я использовать синтаксис функции стрелки ES6 с генераторами? (обозначение стрелки)

т.е. как я могу выразить это:

function *(next) {}

со стрелками Я перепробовал все комбинации, которые мог придумать, и не могу найти никакой документации по этому вопросу.

(в настоящее время используется узел v0.11.14)

171
Ashley Coolman

Могу ли я использовать синтаксис функции стрелки ES6 с генераторами?

Ты не можешь Сожалею. 

Согласно МДН

Инструкция function* (ключевое слово function, за которым следует звездочка) определяет функцию генератора.

Из спецификации документа (мой акцент):

Синтаксис function расширен для добавления необязательного токена *:

FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")" 
  "{" FunctionBody "}"
154
user663031

Разница между Inline-функциями и Arrow-функциями

Прежде всего Arrow-функции() => {} не предназначены для замены Inline-функций function(){}, и они отличаются . Inline-функции - это просто функции, поэтому вопрос в том, в чем разница между функциями Arrow и Inline -Функции есть.

Выражение функции стрелки (также известное как функция стрелки) имеет более короткий синтаксис по сравнению с выражениями функции и не связывает свои собственные this, arguments, super или new.target). Функции стрелок всегда анонимны.

Еще несколько быстрых подробностей здесь


Почему Arrow-функция не может быть использована в качестве генератора

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

Использование ключевого слова yield

Ключевое слово yield не может использоваться в теле функции стрелки (кроме случаев, когда это разрешено внутри функций, дополнительно вложенных в нее). Как следствие, функции стрелок не могут быть использованы в качестве генераторов.

Обратите внимание, что generators без yield не имеет смысла.


Почему Arrow-функция не может использовать yield

http://tc39wiki.calculist.org/es6/arrow-functions/

Функции стрелок связывают this лексически, связывают return в корпусе Block, поэтому он возвращается из непосредственно включающей функции стрелки и исключают break и continue из ссылок на операторы вне непосредственно включающей функции стрелки. 

Первичное выражение Identifierarguments нельзя использовать в теле функции-стрелки (будь то выражение или блочная форма). 

Аналогично, yield нельзя использовать в теле функции стрелки. Стрелки не могут быть генераторами, и мы не хотим глубоких продолжений. 

Выход в функции со стрелкой вызовет семантическую ошибку: http://www.ecma-international.org/

В конце концов, причина кроется в глубокой сложности внедрения ECMA6. C # также не допускает этого по несколько схожим причинам .

96
CoderPi

В дополнение к обсуждению на esdiscuss.org и в примечаниях к совещанию ES6 комитета Ecma TC39 за ноябрь 2013 г. упоминалось выше, стрелки генератора были вновь рассмотрены на двух совещаниях ES7 в сентябре 2016 г. [1][2] . После обсуждения плюсов и минусов различного синтаксиса (в основном =*> и =>*) и отсутствия обоснований и вариантов использования этой функции они пришли к выводу, что:

  • Комитет заинтересован в некотором интересе, но обеспокоен тем, что эта функция не дает возможности добавить новый синтаксис
  • Запланируйте повторное посещение в День 3, чтобы посмотреть, сможем ли мы получить =>* как минимум на этапе 0, как часть предложения асимметричной итерации [Domenic Denicola]

Предложение по стрелкам-генераторам было перенесено на стадию 1 с Бренданом Эйхом и Домеником Дениколой в качестве чемпионов, но соответствующего tc39/предложений репо пока не существует. Я предполагаю, что для получения дальнейших новостей нужно подождать, пока предложение по асинхронной итерации на этапе 3 будет завершено.

22
monk-time

Я знаю, что это очень поздно, но другой возможной причиной может быть синтаксис. возможно (*() => {}) работает, но как насчет (9 ** () => {})? Это 9 к степени функции стрелки, возвращающей NaN, или это 9 раз функция стрелки генератора, также возвращающая NaN? Это может быть сделано с использованием некоторого альтернативного синтаксиса, такого как =>*, как упомянуто в другом ответе здесь, но, возможно, было желание сохранить согласованность синтаксиса функции генератора (например, function* () {} и { *genMethod() {} }) при его реализации. Не слишком оправдание, но причина для этого.

2
coolreader18

У меня тоже был такой же вопрос и я пришел сюда. После прочтения постов и комментариев я почувствовал, что использование генератора в функции со стрелкой выглядит расплывчато:

const generator = () => 2*3; // * implies multiplication
// so, this would be a confusing
const generator = () =>* something; // err, multiplying?
const generator = () =*> ... // err, ^^
const generator = ()*=> ... // err, *=3, still multiplying?
const generator=*()=> ... // err, ^^
const generator = *param => ... //err, "param" is not fixed Word

Это может быть главной причиной того, что они не реализовали генератор в связи с функцией стрелки.


Но если бы я был одним из них, я мог бы подумать так:

const generator = gen param => ... // hmm, gen indicates a generator
const generator = gen () => ... // ^^

Это похоже на то, что у нас есть асинхронная функция:

const asyncFunction = async () => ... // pretty cool

Поскольку с нормальной функцией существует ключевое слово async, так что функция стрелки использует его - async () => может показаться async function().

Но нет такого ключевого слова, как gen или generator, и, увы, функция стрелки его не использует.

Заключить:

Даже если они хотят реализовать генератор в функции стрелки, я думаю, что им нужно пересмотреть синтаксис генератора в ядре js:

generator function myfunc() {}
// rather than
function* myfunc() {} // or, function *myfunc() {}

И это будет большой ошибкой. Таким образом, держать стрелку подальше от генератора довольно круто.


Следующий @Bergi комментарий :

Нет. Предполагается, что функции со стрелками должны быть легкими (и не иметь, например, .prototype) и часто однострочными, тогда как генераторы в значительной степени противоположны.

Я скажу, что целью генератора является run-stop-run, и поэтому я не думаю, что нам нужно заботиться о прототипе, лексическом выражении и т.д.

1
Bhojendra Rauniyar

Существует хороший обходной путь с Redx-сага

import { call, all } from 'redux-saga/effects';

function* gen() {
   yield all([].map(() => {
      return call(....);
   }));
}
0
Julius Baltrušaitis