Bisakah saya menggunakan sintaks fungsi panah ES6 dengan generator? (notasi panah)

243

yaitu bagaimana cara mengekspresikan ini:

function *(next) {}

dengan panah. Saya sudah mencoba semua kombinasi yang dapat saya pikirkan, dan saya tidak dapat menemukan dokumentasi di dalamnya.

(saat ini menggunakan simpul v0.11.14)

Ashley Coolman
sumber
5
Kamu tidak bisa Maaf. " function*Pernyataan (kata kunci fungsi diikuti oleh tanda bintang) mendefinisikan fungsi generator."
2
Perhatikan bahwa ada diskusi yang agak panjang tentang topik ini di esdiscuss.org .
voithos
4
Apa yang Anda harapkan param*=>{ }?
CoderPi
4
Anda tahu itu function(){}tidak melakukan hal yang sama ()=>{}?
CoderPi
8
" Benarkah generator ES6 2 langkah maju dan 1 langkah mundur? " - tidak, generator hanya bisa maju :-)
Bergi

Jawaban:

231

Bisakah saya menggunakan sintaks fungsi panah ES6 dengan generator?

Kamu tidak bisa Maaf.

Menurut MDN

The function*pernyataan ( functionkata kunci diikuti dengan tanda bintang) mendefinisikan function generator.

Dari dokumen spesifikasi (penekanan saya):

The Fungsi sintaks diperpanjang untuk menambahkan opsional *tanda:

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

sumber
175
Terasa seperti cacat desain bagi saya.
Jonathon
23
@ Jonathon: Tidak. Fungsi panah seharusnya ringan (dan tidak memiliki .prototypemisalnya) dan seringkali satu-liner, sedangkan generator sangat berlawanan.
Bergi
38
Saya sudah menjalankan beberapa skenario di mana generator yang saya mainkan dengan akses yang dibutuhkan ke sebelumnya this, dan harus menulis let self = thishack untuk mendapatkan akses ke dalamnya di dalam generator. Sintaks lexical scope + panah akan lebih baik. Sayangnya, tetapi bukan akhir dari dunia.
dvlsg
3
Beberapa konteks tambahan di sekitar ini di esdiscuss
Nick Tomlin
20
@Bergi alasan di balik fungsi panah jauh lebih rumit dari itu. Ini bukan tentang singkatnya. Fungsi panah tidak harus ringan - memang benar ada sintaks tubuh pernyataan tunggal opsional, tapi terus kenapa. Banyak orang menggunakan panah untuk semua definisi fungsi kecuali metode kelas, dan menurunkan functionkata kunci menjadi 'bagian buruk' dari bahasa. Ada alasan bagus untuk melakukan ini. Bagi orang-orang ini, kurangnya generator panah adalah inkonsistensi yang mengganggu.
callum
132

Perbedaan antara fungsi sebaris dan fungsi panah

Pertama-tama fungsi-Arrow () => {} tidak dibuat untuk menggantikan fungsi-fungsi Inline function(){}dan mereka berbeda. Inline-Functions hanyalah Functions, jadi pertanyaannya adalah apa perbedaan antara Arrow-functions dan Inline-Functions.

Ekspresi panah fungsi (juga dikenal sebagai fungsi panah) memiliki sintaks yang lebih pendek dibandingkan dengan ekspresi fungsi dan tidak mengikat sendiri this, arguments, super, atau new.target). Fungsi panah selalu anonim.

Beberapa detail lebih cepat di sini


Mengapa fungsi Arrow tidak bisa digunakan sebagai generator

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

Penggunaan kata kunci hasil

Kata kunci hasil tidak boleh digunakan di badan fungsi panah (kecuali bila diizinkan di dalam fungsi yang bersarang lebih jauh di dalamnya). Akibatnya, fungsi panah tidak dapat digunakan sebagai generator.

Perhatikan bahwa generator tanpa yieldmasuk akal.


Mengapa fungsi Arrow tidak bisa menggunakan hasil

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

Fungsi panah diikat thissecara leksikal, diikat returndalam case Block sehingga kembali dari fungsi panah yang segera dilampirkan, dan menghalangi breakdan continuedari pernyataan pernyataan di luar fungsi panah yang segera dilampirkan.

The Identifier ekspresi utama argumentstidak boleh digunakan di dalam tubuh panah fungsi (apakah ekspresi atau bentuk block).

Demikian juga, yieldtidak dapat digunakan dalam tubuh fungsi panah. Panah tidak bisa menjadi generator dan kami tidak ingin kelanjutan yang dalam.

Menghasilkan dalam Arrow-Function akan menghasilkan Semantic Error: http://www.ecma-international.org/

Pada akhirnya alasannya adalah kompleksitas yang mendalam dalam implementasi ECMA6. C # tidak mengizinkan ini juga karena alasan yang agak mirip .

CoderPi
sumber
3
Saya menggunakan mesin pencari dan memposting satu Penjelasan lagi untuk Anda
CoderPi
1
Saya masih berpikir bahwa menambahkan penjelasan tentang ()=>{}akan banyak membantu, untuk memahami perbedaannya dari fungsi in-line, dan mengapa batasan ada untuk generator.
vitaly-t
63
Saya mencoba mencari tahu mengapa *() => { yield bla; }tidak baik-baik saja, tetapi async () => { await bla; }...
Lee Benson
7
@CodeiSir, Re " dan kami tidak ingin kelanjutan yang mendalam ", alasan buruk.
Pacerier
9
Argumen Anda bersifat siklis. Anda mengatakan bahwa fungsi panah tidak dapat menjadi generator karena mereka tidak dapat memiliki kata kunci hasil di dalamnya. Tetapi mereka tidak dapat memiliki kata kunci hasil, karena mereka tidak bisa menjadi generator: "Panah tidak bisa menjadi generator dan kami tidak ingin kelanjutan yang mendalam."
Thayne
36

Selain diskusi tentang esdiscuss.org dan catatan pertemuan komite ES6 Ecma TC39 dari November 2013 yang disebutkan di atas, panah generator ditinjau kembali dalam dua pertemuan ES7 September 2016 [1] [2] . Setelah diskusi tentang pro dan kontra dari berbagai sintaks (terutama =*>dan =>*) dan kurangnya pembenaran dan kasus penggunaan untuk fitur ini, mereka sampai pada kesimpulan bahwa:

  • Ada beberapa minat dari panitia, tetapi kekhawatiran bahwa fitur tersebut tidak menarik untuk menambahkan sintaks baru
  • Berencana untuk mengunjungi kembali pada Hari 3 untuk melihat apakah kita bisa mencapai =>*tahap 0 setidaknya, sebagai bagian dari proposal iterasi [Domenic Denicola]

Usulan untuk generator panah dipindahkan ke Tahap 1 dengan Brendan Eich dan Domenic Denicola sebagai juara. Iterasi asinkron yang disebutkan di atas telah selesai dan diimplementasikan pada tahun 2018.

Pada Oktober 2019, sebuah repo resmi oleh Sergey Rubanov muncul dengan lebih banyak diskusi tentang sintaksis dan perincian lainnya.

waktu bhikkhu
sumber
8

Saya juga memiliki pertanyaan yang sama dan datang ke sini. Setelah membaca posting dan komentar, saya merasa menggunakan generator dalam fungsi panah tampaknya tidak jelas:

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

Inilah yang mungkin menjadi alasan utama mereka tidak mengimplementasikan generator dalam kaitannya dengan fungsi panah.


Tetapi, jika saya salah satu dari mereka, saya dapat berpikir seperti ini:

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

Ini terasa seperti kita memiliki fungsi asinkron:

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

Karena, dengan fungsi normal, kata kunci async ada, jadi fungsi panah menggunakannya - async () =>sepertinya async function().

Tapi, tidak ada kata kunci seperti genatau generatordan sayangnya fungsi panah tidak menggunakannya.

Untuk menyimpulkan:

Bahkan jika mereka ingin mengimplementasikan generator dalam fungsi panah, saya pikir mereka perlu memikirkan kembali tentang sintaks generator di core js:

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

Dan ini akan menjadi kesalahan besar. Jadi, menjaga fungsi panah dari generator, cukup keren.


Mengikuti @Bergi komentar :

Tidak. Fungsi panah seharusnya ringan (dan tidak memiliki .prototype misalnya) dan seringkali satu-liner, sedangkan generator sangat berlawanan.

Saya akan mengatakan bahwa tujuan penggunaan generator adalah run-stop-run dan jadi saya tidak berpikir kita perlu peduli dengan prototipe, leksikal ini, dll.

Bhojendra Rauniyar
sumber
2
Bisa juga mempertimbangkan opsi eksotis juga () ~> { yield 'a'; yield 'b'; }. Sejujurnya saya suka tildes.
Gershom
@Gershom Ini adalah bagaimana bahasa pemrograman seperti Perl benar-benar salah
Sapphire_Brick
2

Saya tahu ini sudah sangat terlambat, tetapi alasan lain yang mungkin bisa jadi adalah sintaksis. mungkin (*() => {})berhasil, tapi bagaimana (9 ** () => {})? Apakah itu 9 pangkat fungsi panah, kembali NaN, atau 9 kali fungsi generator panah, juga kembali NaN? Ini dapat dilakukan dengan beberapa sintaks alternatif, seperti yang =>*disebutkan oleh jawaban lain di sini, tetapi mungkin ada keinginan untuk mempertahankan konsistensi sintaks fungsi generator (mis. function* () {}Dan { *genMethod() {} }) ketika sedang dilaksanakan. Bukan terlalu banyak alasan, tapi alasan untuk itu.

coolreader18
sumber
1
: +1: untuk tanda bintang ganda ... Orang sekolah JS tua di sini. Siapa bilang Anda tidak bisa mengajari anjing tua trik baru: kegembiraan:
Shanimal
Satu-satunya alasan mereka tidak melakukannya, adalah karena membuat pengurai itu sulit. Ini sepenuhnya mungkin dan tidak memerlukan kompromi dalam sintaksis.
Jason McCarrell
@JasonMcCarrell Jika mereka cukup peduli untuk tidak membuat parser terlalu rumit, maka mungkin Brendan Eich seharusnya meletakkan Skema di browser.
Sapphire_Brick
1

Saat ini Anda tidak bisa, tetapi di masa depan Anda mungkin karena TC39 mengeluarkan proposal yang sama pada Oktober 2019, yang berada di tahap 1.

Gourav Makhija
sumber
-4

Ada solusi yang bagus dengan redux-saga

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

function* gen() {
   yield all([].map(() => {
      return call(....);
   }));
}
Julius Baltrušaitis
sumber
4
Bagaimana kita tahu OP menggunakan Redux?
Maros