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


т. е. как мне выразить это:

function *(next) {}

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

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

5 159

5 ответов:

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

вы не можете. К сожалению.

по данным MDN

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

С spec document (Курсив мой):

The функции синтаксис расширен, чтобы добавить необязательный * токен:

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

разница между встроенными функциями и стрелками-функциями

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

есть хороший обходной путь с redux-saga

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

function* gen() {
   yield all([].map(() => {
      return call(....);
   }));
}