-
Notifications
You must be signed in to change notification settings - Fork 62
/
Copy path44_01_promises_basic.js
149 lines (123 loc) · 3.64 KB
/
44_01_promises_basic.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
/**
* Promise = Janji ...sama seperti artinya, promise di Javascript
* juga mengadopsi istilah yang sama....dimana sebuah script/statement
* menjanjikan sesuatu, jika ditepati (ada hasilnya) maka panggil Callback
* jika diingkari (error) panggill callback juga
*
* Promise ini berguna banget untuk menyelesaikan masalah Callback Hell
*
* Promise sudah bisa dipakai di browser-browser saat ini seperti
* Chrome, FF, Safari, Edge...
*/
let promise = new Promise(function(resolve, reject) {
// some code
});
console.log(promise); // [object Promise] { ... }
// dimana resolve dan reject adalah function callback
let user = new Promise(function(resolve, reject) {
// misalnya melakukan Async call ke server
let fetch = fetchUser('/user/20');
if (fetch) {
resolve(fetch);
} else {
reject('Gagal load data');
}
});
user.then(function(result) { // resolve callback
console.log(result); // data user
}, function(err) { // reject callback
console.log(err); // Gagal load data
});
// kalao mau lebih jelas, user.then() diatas bisa kita remake sbb
let resolve = function(result) {
console.log(result); // data user
};
let reject = function(err) {
console.log(err); // Gagal load data
};
user.then(resolve, reject);
/**
* Promise terdiri dari 3 state, yaitu
* 1. pending: tahap inisialisasi
* 2. fulfilled: operasi success / complete
* 3. rejected: eperasi gagal
*/
let statePromise = new Promise(function(result, reject) {
// pending state
if (true) {
resolve(); // fulfilled state
} else {
reject(); // rejected state
}
});
/**
* Promise static Methods ada 4
*
* Promise.all(), Promise.race(), Promise.reject(), Promise.resolve();
*/
/**
* Promis prototype Method ada 3
*
* Promise.prototype.catch(onReject) <--- catch error/rejection
* Promise.prototype.then(onResolve, onReject) <-- handle fulfilled and rejected state
* Promise.prototype.finally(onFinal) <-- biasanya call Promise yang lain
*/
/**
* Pada penulisan cllback user.then(resolve, reject);
*
* function then() ambil 2 argument, jika kita mau 1 argumen saja, kita bisa
* pakai catch khusus untuk menghandle reject...
*
* lebih reccomended pakai catch(). karena lebih enak kode-nya...
*/
// tanpa catch
user.then(function(result) {
console.log(result);
}, function(err) {
console.log(err);
});
// dengan catch
user.then(function(result) {
// handle result
}).catch(function(err) {
// handle error
});
// atau
user.then(resolve)
.catch(reject);
/**
* Kapan harus pakai Promise? ketika kita banyak menggunakan Async call
* ke Server/ke Remote server atau mungkin untuk
* operasi Async lainnya yang membutuhkan delay seperti setTimeout()
* atau untuk operasi yang time-consuming seperti manipulasi DOM
* menulis/baca file di Node.JS
*/
/**
* Real-world example Promise
*
* misal kita mau load Image dari situs lain
*/
const loadImage = function(url) {
return new Promise((resolve, reject) => {
// Asynx Call
let request = new XMLHttpRequest();
request.open('GET', url);
request.responseType = 'base64';
request.onload = () => {
if (request.status === 200) {
resolve(request.response);
}
};
request.onerror = () => {
reject(Error('Gagal load image.' + request.statusText));
};
request.send();
});
};
loadImage('https://example.com/images/img.png')
.then((result) => {
console.log(result); // base64 image
// atau bisa append ke html tag
}, (err) => {
console.log(err);
});