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)
javascript
ecmascript-6
generator
arrow-functions
Ashley Coolman
sumber
sumber
function*
Pernyataan (kata kunci fungsi diikuti oleh tanda bintang) mendefinisikan fungsi generator."param*=>{ }
?function(){}
tidak melakukan hal yang sama()=>{}
?Jawaban:
Kamu tidak bisa Maaf.
Menurut MDN
Dari dokumen spesifikasi (penekanan saya):
sumber
.prototype
misalnya) dan seringkali satu-liner, sedangkan generator sangat berlawanan.this
, dan harus menulislet self = this
hack untuk mendapatkan akses ke dalamnya di dalam generator. Sintaks lexical scope + panah akan lebih baik. Sayangnya, tetapi bukan akhir dari dunia.function
kata kunci menjadi 'bagian buruk' dari bahasa. Ada alasan bagus untuk melakukan ini. Bagi orang-orang ini, kurangnya generator panah adalah inkonsistensi yang mengganggu.Perbedaan antara fungsi sebaris dan fungsi panah
Pertama-tama fungsi-Arrow
() => {}
tidak dibuat untuk menggantikan fungsi-fungsi Inlinefunction(){}
dan mereka berbeda. Inline-Functions hanyalah Functions, jadi pertanyaannya adalah apa perbedaan antara Arrow-functions dan Inline-Functions.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
Perhatikan bahwa generator tanpa
yield
masuk akal.Mengapa fungsi Arrow tidak bisa menggunakan hasil
http://tc39wiki.calculist.org/es6/arrow-functions/
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 .
sumber
()=>{}
akan banyak membantu, untuk memahami perbedaannya dari fungsi in-line, dan mengapa batasan ada untuk generator.*() => { yield bla; }
tidak baik-baik saja, tetapiasync () => { await bla; }
...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: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.
sumber
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:
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:
Ini terasa seperti kita memiliki fungsi asinkron:
Karena, dengan fungsi normal, kata kunci async ada, jadi fungsi panah menggunakannya -
async () =>
sepertinyaasync function()
.Tapi, tidak ada kata kunci seperti
gen
ataugenerator
dan 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:
Dan ini akan menjadi kesalahan besar. Jadi, menjaga fungsi panah dari generator, cukup keren.
Mengikuti @Bergi komentar :
Saya akan mengatakan bahwa tujuan penggunaan generator adalah run-stop-run dan jadi saya tidak berpikir kita perlu peduli dengan prototipe, leksikal ini, dll.
sumber
() ~> { yield 'a'; yield 'b'; }
. Sejujurnya saya suka tildes.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, kembaliNaN
, atau 9 kali fungsi generator panah, juga kembaliNaN
? 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.sumber
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.
sumber
Ada solusi yang bagus dengan redux-saga
sumber