-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path13e-chainingpromises.js
executable file
·161 lines (153 loc) · 4.9 KB
/
13e-chainingpromises.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
/** -- chaining promises --
*
* kita sudah tau buruknya penulisan callback hell. namun hal tsb tidak dapat dihindari
* dimana proses asynch saling bergantung satu sama lain.
* utk menghindari callback, salah satu solusi adalah menggunakan promise
*
* dengan promise kita melakukan proses asynch secara berantai.
* contoh ketika membuat 1 gelas kopi, ada beberapa tahapan yang dikerjakan seperti
* menghidupkan mesin, mengecek stok biji kopi dan air, membuat kopi dan memindahkannya ke dalam gelas
* tahapan tsb harus dilakukan secara berurut
*
* utk memastikan rangkaian promise berjalan dengan sesuai, kita perlu me-return
* promise selanjutnya. contoh seperti ini
*
* ---ini kode --
* function makeEspresso(){
* checkAvailability()
* .then(value)=> {
* console.log(value);
* return checkStock()
* })
* .then((value)=>{
* console.log(value)
* return brewCoffee();
* })
* .then((value)=>{
* console.log(value);
* })
* .catch((rejectedReason)=>{
* console.log(rejectedReason);
* });
* }
*
* makeEspresso();
* ---akhir kode ---
*/
// mari kita bedah masing2 fungsi promise diatas :
// 1. mesin mengecek ketersediaan. jika mesin tdk sibuk, makan promise mesin mengembalikan status resolve("mesin kopi siap digunakan")
// namun jika mesin sdg sibuk, maka dikembalikan reject("maaf mesin sedang sibuk")
// berikut kode cek pemeriksaannya
const checkAvailability = ()=>{
return new Promise((resolve, reject)=>{
setTimeout(()=>{
if (!state.isCoffeeMachineBusy){
resolve("mesin kopi siap digunakan");
} else {
reject("maaf, mesin sedang sibuk");
}
},1000);
});
};
//pada kode diatas, mesing menggunakan setTimeout 1000ms.
// sedang objek utk menyimpan state dr mesin kopi adalah sbb:
const state = {
stock : {
coffebeans : 250,
water : 1000,
},
isCoffeMachineBusy: false,
}
// kemudian mesin kopi perlu memastikan bahwa stok biji kopi dan air ckup utk membuat kopi
const checkStock = () => {
return new Promise((resolve,reject)=>{
state.isCoffeMachineBusy = true;
setTimeout(()=>{
if (state.stock.coffebeans >=16 && state.stock.water >=250){
resolve("stok cukup. bs membuat kopi");
} else {
reject("stok tidak ckupp");
}
}, 1500);
});
};
// lalu fungsi promise yang terakhir adalah fungsi mencampur kopi dan air lalu menghidangkan ke dalam gelas kopi
// fungsi ini mengembalikan promise dg status resolve "kopi sudah siap"
const brewCoffee = ()=> {
console.log("membuat kopi anda ...")
return new Promise((resolve, reject)=> {
setTimeout(()=>{
resolve("kopi sudah siap")
},2000);
});
};
// cara baca kodenya :
// buat espresso? cek dlu ready mesinnya, lalu periksa stok biji dan aer dalam mesin. lalu buat kopi
// apabila promise gagal, metod .catch() yg akan menangani. baik karena mesin sibuk atau stok habis
// berikut kode lengkap skenario nya :
[
const state = {
stock: {
coffeeBeans: 250,
water: 1000,
},
isCoffeeMachineBusy: false,
}
const checkAvailability = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (!state.isCoffeeMachineBusy) {
resolve("Mesin kopi siap digunakan.");
} else {
reject("Maaf, mesin sedang sibuk.");
}
}, 1000);
});
};
const checkStock = () => {
return new Promise((resolve, reject) => {
state.isCoffeeMachineBusy = true;
setTimeout(() => {
if (state.stock.coffeeBeans >= 16 && state.stock.water >= 250) {
resolve("Stok cukup. Bisa membuat kopi.");
} else {
reject("Stok tidak cukup!");
}
}, 1500);
});
};
const brewCoffee = () => {
console.log("Membuatkan kopi Anda...")
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Kopi sudah siap!")
}, 2000);
});
};
function makeEspresso() {
checkAvailability()
.then((value) => {
console.log(value);
return checkStock();
})
.then((value) => {
console.log(value)
return brewCoffee();
})
.then(value => {
console.log(value);
state.isCoffeeMachineBusy = false;
})
.catch(rejectedReason => {
console.log(rejectedReason);
state.isCoffeeMachineBusy = false;
});
}
makeEspresso();
/* output
Mesin kopi siap digunakan.
Stok cukup. Bisa membuat kopi.
Membuatkan kopi Anda...
Kopi sudah siap!
*/
]