Fungsi Generator dalam TypeScript
Artikel ini menjelaskan fungsi generator dalam TypeScript.
Anda dapat mempelajari segalanya mulai dari dasar cara menggunakan fungsi generator hingga contoh lanjutan yang dikombinasikan dengan pemrosesan asinkron, beserta sampel kode.
YouTube Video
Fungsi Generator
Fungsi generator dalam TypeScript menyediakan fungsionalitas yang mirip dengan fungsi generator pada JavaScript. Fungsi generator didefinisikan menggunakan function*
(deklarasi fungsi dengan tanda bintang) dan merupakan fungsi khusus yang dapat menghentikan dan melanjutkan eksekusi tidak seperti fungsi normal.
Ketika sebuah fungsi generator dipanggil, sebuah iterator dikembalikan, yang menghasilkan nilai satu per satu melalui iterator ini, dan Anda dapat menghentikan eksekusi menggunakan kata kunci yield
atau mengirim nilai dari luar.
Sintaks Dasar Fungsi Generator
1function* myGenerator(): Generator<number, void, unknown> {
2 yield 1;
3 yield 2;
4 yield 3;
5}
6
7const gen = myGenerator();
8
9console.log(gen.next().value); // 1
10console.log(gen.next().value); // 2
11console.log(gen.next().value); // 3
12console.log(gen.next().done); // true (Iteration finished)
- Definisikan fungsi generator dengan
function* myGenerator()
. - Kata kunci
yield
menghentikan eksekusi fungsi sambil mengembalikan nilai. - Setiap kali metode
next()
dipanggil, eksekusi fungsi generator dilanjutkan dan bergerak keyield
berikutnya.
next()
mengembalikan sebuah objek yang mengandung nilai berikutnya dan properti done
. Ketika done
adalah true
, ini menunjukkan bahwa semua nilai telah dihasilkan dan pemrosesan generator telah selesai.
Aplikasi Fungsi Generator
Menggunakan fungsi generator memungkinkan representasi pemrosesan berurutan dengan mudah. Dalam contoh berikut, kami membuat fungsi generator yang menghasilkan urutan angka.
1function* sequenceGenerator(start: number = 0, step: number = 1) {
2 let current = start;
3 while (true) {
4 yield current;
5 current += step;
6 }
7}
8
9const seq = sequenceGenerator(1, 2);
10
11console.log(seq.next().value); // 1
12console.log(seq.next().value); // 3
13console.log(seq.next().value); // 5
- Dalam contoh ini,
sequenceGenerator
menghasilkan urutan angka yang meningkat tanpa batas. Gunakanyield
untuk mengembalikan nilai pada setiap langkah, dan hasilkan nilai berikutnya pada panggilan selanjutnya.
Mengirimkan Nilai ke next
Metode next()
dapat menerima nilai, yang dapat dikirimkan ke dalam fungsi generator.
1function* adder() {
2 const num1 = yield;
3 const num2 = yield;
4 yield num1 + num2;
5}
6
7const addGen = adder();
8addGen.next(); // Initialization
9addGen.next(5); // Set 5 to num1
10const result = addGen.next(10).value; // Set 10 to num2 and get result
11console.log(result); // 15
- Dalam contoh ini,
next(5)
dannext(10)
mengirimkan nilai masing-masing ke dalam fungsi generator, danyield num1 + num2
mengembalikan jumlahnya.
return
dan throw
return(value)
dapat menghentikan generator dan mengembalikan nilai yang ditentukan.throw(error)
dapat melemparkan pengecualian di dalam generator, digunakan untuk menangani pengecualian di dalam generator.
1function* testGenerator() {
2 try {
3 yield 1;
4 yield 2;
5 } catch (e) {
6 console.error("Error caught:", e);
7 }
8}
9
10const gen = testGenerator();
11console.log(gen.next().value); // 1
12gen.throw(new Error("An error occurred!")); // Error caught: An error occurred!
- Dalam contoh ini, metode
throw
digunakan untuk menghasilkan kesalahan di dalam generator, dan kesalahan tersebut ditangkap di dalam generator.
Definisi Tipe dalam TypeScript
Definisi tipe dari fungsi generator dapat ditentukan dalam format berikut.
1// Generator<YieldType, ReturnType, NextType>
2function* myGenerator(): Generator<number, void, unknown> {
3 yield 1;
4 yield 2;
5 yield 3;
6}
- Anda menentukan tipe dalam bentuk
Generator<YieldType, ReturnType, NextType>
.YieldType
adalah tipe dari nilai yang dikembalikan olehyield
.ReturnType
adalah tipe dari nilai yang dikembalikan olehreturn
.NextType
adalah tipe dari nilai yang diteruskan kenext()
.
Dalam contoh berikut, tipe spesifik ditentukan untuk menggunakan generator dengan aman menggunakan tipe.
1function* numberGenerator(): Generator<number, void, number> {
2 const num1 = yield 1;
3 const num2 = yield num1 + 2;
4 yield num2 + 3;
5}
6
7const gen = numberGenerator();
8
9console.log(gen.next().value); // 1
10console.log(gen.next(10).value); // 12 (10 + 2)
11console.log(gen.next(20).value); // 23 (20 + 3)
Generator dan Pemrosesan Asinkron
Generator juga dapat digunakan untuk pemrosesan asinkron. Sebagai contoh, Anda dapat menggunakan yield
untuk menunggu hasil operasi asinkron sambil melanjutkan pemrosesan secara sequential. Namun, dalam TypeScript atau JavaScript, async/await
lebih sering digunakan.
1function* asyncTask() {
2 const result1 = yield fetch("https://codesparklab.com/json/example1.json");
3 console.log(result1);
4
5 const result2 = yield fetch("https://codesparklab.com/json/example2.json");
6 console.log(result2);
7}
Oleh karena itu, meskipun Anda dapat memproses operasi asinkron secara sequential dengan generator, generator tidak sering digunakan untuk pemrosesan asinkron karena Promises dan async
/await
lebih praktis.
Ringkasan
- Fungsi generator adalah fungsi khusus yang didefinisikan dengan
function*
yang dapat mengembalikan nilai denganyield
sambil menghentikan eksekusi fungsi. - Gunakan
next()
untuk melanjutkan generator dan menerima nilai. Selain itu, Anda dapat mengirim nilai ke generator menggunakannext(value)
. - Anda dapat menggunakan
return()
danthrow()
untuk menghentikan fungsi generator atau menangani kesalahan. - Saat menggunakan generator dalam TypeScript, Anda dapat memanfaatkan definisi tipe untuk menulis kode yang aman terhadap tipe.
Generator adalah alat yang kuat yang memungkinkan Anda untuk mengontrol iterasi secara fleksibel.
Anda dapat mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Silakan periksa juga saluran YouTube kami.