-
Notifications
You must be signed in to change notification settings - Fork 62
/
Copy path45_async_await.js
163 lines (141 loc) · 4.13 KB
/
45_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
/**
* Async Await adalah fitur baru Javascript yang dibangun diatas
* Promise.
*
* Async Await juga sebenarnya adalah syntatic sugar dari Promise. Dimana
* kita semakin dimudahkan dalam menulis kode nya. Async Await juga membuat Promise
* terlihat lebih bergaya "syncron" dibanding "asyncron", artinya lebih enak dibaca dan
* dimengerti
*
* Async function adalah function yang me-return Promise
*/
async function sayHello() {
return 'hello';
}
// itu sama aja dengan
function sayHello() {
return Promise(function(resolve, reject) {
resolve('hello');
});
}
/**
* Await adalah syntax yang digunakan untuk menunggu sebuah promise
* sampai selesai dan memberikan hasil baik itu hasilnya resolve atau reject.
*
* Await hanya boleh berada didalam block Async function
*/
async function getUser() {
let user = await fetchUser('/api/user'); // fetchUser adalah promise juga
// saat sudah resolve, maka hasilnya akan di-assign ke variable user
return user;
}
// karena getUser() sekarang adalah Promise, maka bisa kita panggil seperti
// promise pada Umumnya
getUser()
.then(function(result) {
console.log(result);
})
.catch(function(err) {
console.log(err);
});
// Mari kita ubah dari Promise biasa menjadi Async-Await
function getUserArtikel() {
// fetch ke server user by username
fetch('api/user/myusername')
.then(function(response1) {
// read ke json
return response1.json();
})
.then(function(response2) {
// fetch lagi ke server, untuk ambil artikel by id
let user_id = response2.user_id;
return fetch('api/user/myusername/artikel/' + user_id);
})
.then(function(response3) {
return response3.json(); // return list aretikel
})
.then(function(response4) {
console.log(response4);
// display list artikel disini
})
.catch(function(err) {
console.log(err);
});
}
// meskipun sudah pakai Promise...yang notabene lebih baik dari Callback hell,
// tetep aja malesin kan kalo nulis nya seperti diatas...
// nah kita bisa kode yang lebih rapih, terlihat seperti kode syncronous biasa
async function getUserArtikel() {
// fetch ke server user by username
let fetchUser = await fetch('url/user/myusername');
let user = await fetchUser.json();
// fetch artikel by user id
let fetchArtikel = await fetch('api/user/myusername/artikel/' + user.user_id);
let artikel = await fetchArtikel.json();
// display artikel disini atau bisa di return
console.log(artikel);
return artikel;
}
getUserArtikel().then(function(result) {
console.log(result);
});
// gimana? terlihat syncronous kan?
/**
* Class method pada ES6 bisa juga berupa async function
*/
class User {
constructor(username) {
this.username = username;
}
async fetchUser() {
let response = await fetch('/api/user/' + this.username);
return response.json();
}
}
let obj = new User('myusername');
obj.fetchUser()
.then(function(result) {
//
})
.catch(function(err) {
//
});
/**
* Error Handling pada Async-Await
*
* Kita bisa mengandalkan .catch() di ujung promise chaining
* atau kita bisa handle terkebih dahulu sebelum me-return hasilnya
*
* Jadi baris ini
*/
let response = await fetch('/api/user/' + this.username);
let user = response.json();
// kita masukan kedalam block try catch sbb
try {
let response = await fetch('/api/user/' + this.username);
let user = response.json();
return { status: true, data: user };
} catch (err) {
// logging error-nya dulu ke suatu tempat
// someLogging.log(err)
// atau kita return bisa kita handle belakangan
return { status: false, error: err };
}
// dengan try catch seperti diatas...kita tidak usah pake .catch lagi
obj.fetchUser()
.then(function(response) {
// response akan berisi output success
// atau error
if (response.status) {
// success
console.log(response.data);
} else {
// on Error
if (!response instanceof Error) {
console.log(response);
} else {
console.log(response.message);
console.log(response.stack);
}
}
});