Saya mendengar tentang kata kunci "hasil" dalam JavaScript, tetapi saya menemukan dokumentasi yang sangat buruk tentang itu. Dapatkah seseorang menjelaskan saya (atau merekomendasikan situs yang menjelaskan) penggunaannya dan untuk apa digunakan?
javascript
yield
keyword
mck89
sumber
sumber
Jawaban:
The Dokumentasi MDN cukup bagus, IMO.
sumber
Terlambat menjawab, mungkin semua orang tahu tentang
yield
sekarang, tetapi beberapa dokumentasi yang lebih baik telah datang.Mengadaptasi contoh dari "Javascript's Future: Generators" oleh James Long untuk standar Harmony resmi:
Begitu
yield
juga sepertireturn
: Anda mendapatkan sesuatu kembali.return x
mengembalikan nilaix
, tetapiyield x
mengembalikan fungsi, yang memberi Anda metode untuk beralih ke nilai berikutnya. Berguna jika Anda berpotensi menjalani prosedur intensif memori yang mungkin ingin Anda interupsi selama iterasi.sumber
function* foo(x){
ada di sana*
. Apakah Anda memerlukannya atau tidak, itu tergantung pada jenis masa depan yang Anda kembalikan. Detailnya panjang: GvR menjelaskannya untuk implementasi Python , di mana implementasi Javascript dimodelkan. Menggunakanfunction *
akan selalu benar, meskipun dalam beberapa kasus sedikit lebih mahal daripadafunction
denganyield
.function *
danyield
, dan menambahkan kesalahan yang dikutip ("Kesalahan awal dinaikkan jika ekspresi hasil atau hasil * terjadi dalam fungsi non-generator"). Tetapi, implementasi Javascript 1.7 asli di Firefox tidak memerlukan*
. Jawaban diperbarui sesuai. Terima kasih!Ini Sangat Sederhana, Ini cara kerjanya
yield
kata kunci hanya membantu untuk menjeda dan melanjutkan fungsi kapan saja secara tidak sinkron .Ambil fungsi generator sederhana ini :
Sampai Anda memanggil _process.next () itu tidak akan mengeksekusi 2 baris kode pertama, maka hasil pertama akan menghentikan sementara fungsi. Untuk melanjutkan fungsi sampai titik jeda berikutnya ( menghasilkan kata kunci ) Anda perlu memanggil _process.next () .
Tetapi sementara yield melakukan jeda ini dan melanjutkan perilaku itu dapat mengembalikan beberapa hasil juga
{value: any, done: boolean}
sesuai dengan fungsi sebelumnya, kami belum mengeluarkan nilai apa pun. Jika kita mengeksplorasi output sebelumnya, hasilnya akan sama{ value: undefined, done: false }
dengan nilai yang tidak ditentukan .Mari kita menggali kata kunci hasil. Secara opsional, Anda dapat menambahkan ekspresi dan menetapkan menetapkan nilai opsional default . (Sintaks dokumen resmi)
Ekspresi : Nilai untuk kembali dari fungsi generator
rv : Mengembalikan nilai opsional yang diteruskan ke metode generator berikutnya ()
Coba sekarang
Penggunaan
Referensi:
sumber
Menyederhanakan / menguraikan jawaban Nick Sotiros (yang menurut saya hebat), saya pikir lebih baik untuk menggambarkan bagaimana seseorang akan mulai mengkodekan dengan
yield
.Menurut pendapat saya, keuntungan terbesar dari menggunakan
yield
adalah akan menghilangkan semua masalah panggilan balik bersarang yang kita lihat dalam kode. Sulit untuk melihat bagaimana pada awalnya, itulah sebabnya saya memutuskan untuk menulis jawaban ini (untuk diri saya sendiri, dan semoga orang lain!)Cara melakukannya adalah dengan memperkenalkan gagasan tentang rutinitas bersama, yang merupakan fungsi yang dapat secara sukarela menghentikan / berhenti sampai mendapatkan apa yang dibutuhkannya. Dalam javascript, ini dilambangkan dengan
function*
. Hanyafunction*
fungsi yang dapat digunakanyield
.Inilah beberapa javascript khas:
Ini kikuk karena sekarang semua kode Anda (yang jelas perlu menunggu
loadFromDB
panggilan ini ) harus berada di dalam panggilan balik yang tampak jelek ini. Ini buruk karena beberapa alasan ...})
yang perlu Anda perhatikan di mana-manafunction (err, result)
jargon ekstra iniresult
Di sisi lain, dengan
yield
, semua ini dapat dilakukan dalam satu baris dengan bantuan kerangka kerja bersama yang bagus.Dan sekarang fungsi utama Anda akan menghasilkan di mana diperlukan ketika perlu menunggu variabel dan hal-hal untuk memuat. Tetapi sekarang, untuk menjalankan ini, Anda perlu memanggil yang normal (fungsi non-coroutine). Kerangka kerja bersama sederhana dapat memperbaiki masalah ini sehingga yang harus Anda lakukan adalah menjalankan ini:
Dan mulai didefinisikan (dari jawaban Nick Sotiro ')
Dan sekarang, Anda dapat memiliki kode cantik yang jauh lebih mudah dibaca, mudah dihapus, dan tidak perlu mengutak-atik indentasi, fungsi, dll.
Pengamatan yang menarik adalah bahwa dalam contoh ini,
yield
sebenarnya hanya kata kunci yang dapat Anda tempatkan sebelum fungsi dengan panggilan balik.Akan mencetak "Hello World". Jadi Anda benar-benar dapat mengubah fungsi callback menjadi menggunakan
yield
hanya dengan membuat tanda tangan fungsi yang sama (tanpa cb) dan kembalifunction (cb) {}
, seperti:Semoga dengan pengetahuan ini Anda dapat menulis kode yang lebih bersih dan mudah dibaca yang mudah dihapus !
sumber
function*
hanya fungsi biasa tanpa hasil?function *
adalah fungsi yang berisi hasil. Ini adalah fungsi khusus yang disebut generator.yield
mana-mana, saya yakin ini lebih masuk akal daripada callback, tetapi saya gagal melihat bagaimana ini lebih mudah dibaca daripada callback.Untuk memberikan jawaban yang lengkap:
yield
bekerja serupa denganreturn
, tetapi dalam generator.Adapun contoh yang umum diberikan, ini berfungsi sebagai berikut:
Tetapi ada juga tujuan kedua dari kata kunci hasil. Ini dapat digunakan untuk mengirim nilai ke generator.
Untuk memperjelas, contoh kecil:
Ini bekerja, sebagai nilai
2
ditugaskan untuky
, dengan mengirimkan ke generator, setelah itu berhenti di hasil pertama (yang kembali0
).Ini memungkinkan kita untuk melakukan beberapa hal yang sangat funky. (lihat coroutine)
sumber
Ini digunakan untuk iterator-generator. Pada dasarnya, ini memungkinkan Anda untuk membuat urutan (berpotensi tak terbatas) menggunakan kode prosedural. Lihat dokumentasi Mozilla .
sumber
yield
juga dapat digunakan untuk menghilangkan panggilan balik neraka, dengan kerangka kerja coroutine.sumber
Generator urutan Fibonacci menggunakan kata kunci hasil.
sumber
Yeild
kata kunci dalam fungsi javaScript membuatnya menjadi generator,Apa itu generator di javaScript?
Arti generator membantu kita bekerja secara serempak dengan iterator bantuan, Oh sekarang apa iterator hack itu? Betulkah?
dari mana iterator membantu kami mengakses item satu per satu? ini membantu kami mengakses item melalui fungsi generator,
fungsi generator adalah fungsi yang kami gunakan
yeild
kata kunci, menghasilkan kata kunci membantu kita dalam menjeda dan melanjutkan eksekusi fungsidi sini adalah contoh cepat
izinkan saya menjelaskan apa yang sedang terjadi
Anda melihat eksekusi sedang dijeda pada setiap
yeild
kata kunci dan kami dapat mengaksesnya terlebih dahuluyield
dengan bantuan iterator.next()
ini beralih ke semua
yield
kata kunci satu per satu dan kemudian kembali tidak terdefinisi ketika tidak ada lagiyield
kata kunci yang tersisa dalam kata-kata sederhana yang dapat Anda ucapkanyield
kata kunci adalah break point di mana fungsi setiap kali jeda dan hanya melanjutkan ketika menyebutnya menggunakan iteratoruntuk kasus kami:
_getMeDrink.next()
ini adalah contoh iterator yang membantu kami mengakses setiap fungsi break pointContoh Generator:
async/await
jika Anda melihat implementasi
async/await
Anda akan melihatgenerator functions & promises
digunakan untuk membuatasync/await
pekerjaanmohon tunjukkan saran yang diterima
sumber
Ketergantungan antara panggilan javascript async.
Contoh bagus lainnya tentang bagaimana hasil dapat digunakan.
sumber
Sebelum Anda belajar tentang hasil, Anda perlu tahu tentang generator. Generator dibuat menggunakan
function*
sintaks. Fungsi generator tidak mengeksekusi kode melainkan mengembalikan jenis iterator yang disebut generator. Ketika nilai diberikan dengan menggunakannext
metode, fungsi generator terus mengeksekusi sampai menemukan kata kunci hasil. Menggunakanyield
memberi Anda kembali objek yang berisi dua nilai, satu adalah nilai dan yang lainnya dilakukan (boolean). Nilainya bisa berupa array, objek, dll.sumber
Contoh sederhana:
sumber
Saya juga mencoba memahami kata kunci hasil. Berdasarkan pemahaman saya saat ini, dalam generator, menghasilkan kata kunci berfungsi seperti saklar konteks-CPU. Ketika pernyataan hasil dijalankan, semua status (misalnya, variabel lokal) disimpan.
Selain itu, objek hasil langsung akan dikembalikan ke pemanggil, seperti {value: 0, done: false}. Penelepon dapat menggunakan objek hasil ini untuk memutuskan apakah akan 'membangkitkan' generator lagi dengan memanggil next () (memanggil next () adalah untuk mengulangi eksekusi).
Hal penting lainnya adalah ia dapat menetapkan nilai ke variabel lokal. Nilai ini dapat dilewati oleh pemanggil 'next ()' saat 'membangunkan' generator. misalnya, it.next ('valueToPass'), seperti ini: "resultValue = yield slowQuery (1);" Sama seperti ketika membangunkan eksekusi berikutnya, pemanggil dapat menyuntikkan beberapa hasil yang berjalan ke eksekusi (menyuntikkannya ke variabel lokal). Jadi, untuk eksekusi ini, ada dua jenis negara:
konteks yang disimpan dalam eksekusi terakhir.
Nilai yang disuntikkan oleh pemicu eksekusi ini.
Jadi, dengan fitur ini, generator dapat memilah beberapa operasi async. Hasil permintaan async pertama akan diteruskan ke yang kedua dengan menetapkan variabel lokal (resultValue dalam contoh di atas). Permintaan async kedua hanya dapat dipicu oleh respons permintaan async pertama. Kemudian permintaan async kedua dapat memeriksa nilai variabel lokal untuk memutuskan langkah selanjutnya karena variabel lokal adalah nilai yang disuntikkan dari respons permintaan pertama.
Kesulitan dari permintaan async adalah:
panggilan balik neraka
kehilangan konteks kecuali meneruskannya sebagai parameter dalam panggilan balik.
hasil dan generator dapat membantu keduanya.
Tanpa hasil dan generator, untuk memilah beberapa permintaan async memerlukan panggilan balik bersarang dengan parameter sebagai konteks yang tidak mudah dibaca dan dipelihara.
Di bawah ini adalah contoh permintaan async dirantai yang berjalan dengan nodejs:
Di bawah ini adalah hasil yang berjalan:
+++++++++++ mulai +++++++++++
query1 0
+++++++++++ end +++++++++++
query2 1
query4 0
Pola keadaan di bawah ini dapat melakukan hal serupa untuk contoh di atas:
Berikut ini adalah hasil yang berjalan:
+++++++++++ mulai +++++++++++
query1 0
+++++++++++ end +++++++++++
query2 1
query4 0
sumber
jangan lupa sintaks 'x of generator' yang sangat membantu untuk loop melalui generator. Tidak perlu menggunakan fungsi next () sama sekali.
sumber