-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path13g-async-await.js
executable file
·166 lines (151 loc) · 5 KB
/
13g-async-await.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/** --- async-wait ---
* contoh penulisan async promise dan callback
*
* --- ini kode ---
* --Promise --
*
* function makeCoffee(){
* getCoffee().then(coffee=> {
* console.log(coffee);
* });
* }
* makeCoffee();
*
* ---Callback ---
*
* function makeCoffee(){
* getCoffee(function(coffee){
* console.log(coffee);
* });
* }
* makeCoffee();
*
* --- akhir kode ---
*
* namun sejak es8, kita dapat menuliskan asynch layaknya synch dengan bantuan async dan await
* fitur async await sebenarnya hanyalah syntatic sugar.
* itu berarti secara fungsionalotas bukanlah sebuah fitur baru dalam JS.
* namun, hanya gaya penulisan baru yang dikembangkan dari kombinasi penggunaan promise dan generator.
* sehingga async await tidak dapt digunakan jika tidak ada promise
*
* berikut penulisannya :
*
* --- ini kode ---
*
* const getCoffee = () =>{
* return new Promise((resolve, reject)=> {
* const seeds = 100;
* setTimeout(()=> {
* if (seeds >=10){
* resolve("kopi didapatkan");
* }else {
* reject("biji kopi habis");
* }
* },100);
* })
* }
* --- akhir kode ---
*
* untuk mendapatkan nilai fungsi getCoffee() menggunakan .then() maka kode akan menjadi:
*
* --- ini kode ---
*
* function makeCoffee() {
getCoffee().then(coffee => {
console.log(coffee);
});
}
makeCoffee();
output :
Kopi didapatkan!
--- akhir kode ---
async await memungkinkan kita menuliskan proses async layaknya proses synch.kira kira kodenya akan
menjadi seperti ini :
--- ini kode ---
function makeCoffee() {
const coffee = getCoffee();
console.log(coffee);
}
makeCoffee();
output:
Promise { <pending> }
---akhir kode ---
*/
// namun kode diatas dijalankan hasilnya tidak sesuai dg harapan karena fungsi
// getCoffee() merupakan objek promise.
// utk menunggu fungsi getCoffee() yang berjalan secara asynch, tambahkan keyword await
// sebelum pemanggilan fungsi getCoffee()
const coffe = await getCoffee();
// karena fungsi makeCoffee() sekarang menangani proses asynch maka fungsi tsb
// juga menjadi fungsi asynch.
// tambahkan asynch sebelum deklarasi fungsi membuat menjadi asynch
async function makeCoffee(){
const coffe = await getCoffee();
console.log(coffe);
}
makeCoffee();
//output : kopi didapatkan !
// keyword async digunakan utk memberitahu JS supaya menjalankan fungsi makeCoffee() secara asynch.
// keyword awati digunakan utk menghentikan proses pembacaan kode selanjutnya sampai fungsi getCoffee() mengembalikan promise resolve.
// walaupun await menghentikan proses pembacaan kode selanjutnya pada fungsi makeCoffee, tetapi tidak akan mengganggu proses runtime
// sesungguhnya pada JS global.
// karena fungsi makeCoffee berjalan asynch kita tidak dapat menggunakan await tanpa membuat funct dalam scope nya berjalan scr asynch
// --- handle onRejected using async-await ---
// perlu dicatat bahwa await hanya akan mengembalikan nilai jika promise berhasil dilakukan (onFullfilled)
// lantas bagaimana jika promise gagal dilakukan?
// sederhana saja, kembali pada prinsip synch kode, kita dapat menangani sebuah error atau tolakan dengan menggunakan try...catch.
// ketika menggunakan async/await, biasakan ketika mendapatkan resolved value dr sebuah promises, selalu menempatkan di dalam blok try seperti berikut :
async function makeCoffee(){
try {
const coffee = await getCoffee();
console.log(coffee);
}
}
// dengan begitu kita dapat menggunakan blok catch utk menangani jika promise gagal dilakukan (onRejected)
[
async function makeCoffee() {
try {
const coffee = await getCoffee();
console.log(coffee);
} catch (rejectedReason) {
console.log(rejectedReason);
}
}
makeCoffee();
//output:Biji kopi habis!
]
// ---chaining promise using async-await ---
// bagaimana melakukan promise berantai apabila menggunakan async await ?
// jawabannya adalah sama seperti kita mendapatkan nilai dr funct yang berjalan scra synch
// dengan pendekatan async-await, kode mesin kopi kita akan seperti ini
[
async function makeEspresso() {
try {
await checkAvailability();
await checkStock();
const coffee = await brewCoffee();
console.log(coffee);
} catch (rejectedReason) {
console.log(rejectedReason);
}
}
makeEspresso();
//output: Membuatkan kopi Anda...
// Kopi sudah siap!
]
// terakhir utk menjalankan beberapa promise sekaligus secara bersamaan dengan Promise.all, kita tulis sbb:
[
async function makeEspresso() {
try {
await checkAvailability();
await checkStock();
await Promise.all([boilWater(), grindCoffeeBeans()]);
const coffee = await brewCoffee();
console.log(coffee);
} catch (rejectedReason) {
console.log(rejectedReason);
}
}
]
// async await akan menjadi fitur baru yang sangat berguna.
// terlebih kita yang lebih nyaman menangani proses asnyc tetapi menggunakan gaya synch