Fungsi Generator dalam TypeScript
Artikel ini menerangkan fungsi generator dalam TypeScript.
Anda boleh mempelajari segalanya dari asas cara menggunakan fungsi penjana sehingga contoh lanjutan yang digabungkan dengan pemprosesan asynchronous, bersama dengan contoh kod.
YouTube Video
Fungsi Generator
Fungsi generator dalam TypeScript menyediakan fungsi yang serupa dengan fungsi generator dalam JavaScript. Fungsi generator ditakrifkan menggunakan function*
(deklarasi fungsi dengan asterisk) dan merupakan fungsi khas yang boleh memberhentikan dan menyambung semula pelaksanaan tidak seperti fungsi biasa.
Apabila fungsi generator dipanggil, sebuah iterator dikembalikan, yang menjana nilai satu demi satu melalui iterator ini, dan anda boleh memberhentikan pelaksanaan menggunakan kata kunci yield
atau menghantar nilai dari luar.
Sintaks Asas 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)
- Takrifkan fungsi generator dengan
function* myGenerator()
. - Kata kunci
yield
memberhentikan pelaksanaan fungsi semasa memulangkan satu nilai. - Setiap kali kaedah
next()
dipanggil, pelaksanaan fungsi generator disambung semula dan bergerak keyield
seterusnya.
next()
mengembalikan satu objek yang mengandungi nilai seterusnya dan sifat done
. Apabila done
adalah true
, ini menunjukkan bahawa semua nilai telah dijana dan pemprosesan generator sudah selesai.
Aplikasi Fungsi Generator
Penggunaan fungsi generator membolehkan penggambaran pemprosesan berurutan dengan mudah. Dalam contoh berikut, kita mencipta satu fungsi generator yang menjana satu urutan nombor.
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
menjana satu urutan nombor yang meningkat tanpa had. Gunakanyield
untuk memulangkan nilai pada setiap langkah, dan menjana nilai seterusnya pada panggilan berikutnya.
Memasukkan Nilai ke next
Kaedah next()
boleh menerima nilai, yang boleh dihantar 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)
menghantar nilai masing-masing ke dalam fungsi generator, danyield num1 + num2
memulangkan jumlahnya.
return
dan throw
return(value)
boleh menamatkan generator dan memulangkan nilai yang ditentukan.throw(error)
boleh melontarkan pengecualian di dalam generator, digunakan untuk mengendalikan pengecualian 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, kaedah
throw
digunakan untuk menjana ralat di dalam generator, dan ralat itu ditangkap dalam generator.
Definisi Jenis dalam TypeScript
Definisi jenis fungsi penjana boleh 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 jenis dalam bentuk
Generator<YieldType, ReturnType, NextType>
.YieldType
ialah jenis nilai yang dipulangkan olehyield
.ReturnType
ialah jenis nilai yang dipulangkan olehreturn
.NextType
ialah jenis nilai yang dihantar kepadanext()
.
Dalam contoh berikut, jenis tertentu ditentukan untuk menggunakan penjana dengan selamat bersama jenis.
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)
Penjana dan Pemprosesan Asynchronous
Penjana juga boleh digunakan untuk pemprosesan asynchronous. Sebagai contoh, anda boleh menggunakan yield
untuk menunggu hasil operasi asynchronous sambil meneruskan pemprosesan secara berturutan. Walau bagaimanapun, dalam TypeScript atau JavaScript, async/await
lebih lazim 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 itu, walaupun anda boleh memproses operasi asynchronous secara berturutan dengan penjana, penjana tidak sering digunakan untuk pemprosesan asynchronous kerana Promises dan async
/await
lebih mudah digunakan.
Ringkasan
- Fungsi penjana adalah fungsi khas yang ditakrifkan dengan
function*
yang boleh mengembalikan nilai denganyield
sambil menghentikan pelaksanaan fungsi. - Gunakan
next()
untuk menyambung semula penjana dan menerima nilai. Selain itu, anda boleh menghantar nilai ke dalam penjana menggunakannext(value)
. - Anda boleh menggunakan
return()
danthrow()
untuk menamatkan fungsi penjana atau mengendalikan ralat. - Apabila menggunakan penjana dalam TypeScript, anda boleh memanfaatkan definisi jenis untuk menulis kod selamat jenis.
Penjana adalah alat yang berkuasa yang membolehkan anda mengawal iterasi dengan fleksibel.
Anda boleh mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Sila lihat juga saluran YouTube kami.