Kesalahan Penggunaan Promise Javascript Bagian 2

Kesalahan Penggunaan Promise Javascript Bagian 2

Melanjutkan dari tulisan sebelumnya mengenai kesalahan penggunaan Promise di Javascript.

Saya ingin membahas kesalahan lebih lanjut dalam penggunaan Promise di Javascript.

Kesalahan #1: Tidak memanfaatkan Promise.resolve()

Kita dapat mempersingkat penggunaan Promise berikut:

Menggunakan Promise.resolve() menjadi seperti berikut:

Demikian juga dengan Promise.reject() , kita bisa menuliskan secara singkat seperti berikut:

Kesalahan #2: then(null, ...) tidak sama dengan catch()

Mari kita bandingkan penggunaan then(null, ...) dan catch() dari kedua script berikut:

Kenapa kedua pasang script tersebut tidak sama? Pada 2 script pertama, keduanya hanya bertugas menangkap kesalahan yang terjadi, sementara pada 2 script berikutnya melakukan proses yang lain.

Pada 2 script terakhir, jika kita tambahkan throw() maka akan lebih terlihat perbedaannya.

Seperti yang kita lihat, jika kita menggunakan catch() maka kita dapat menangkap error yang dilempar oleh throw() yang bisa berasal dari suatu fungsi di sana. Sementara jika menggunakan then(null, ...) , kita tidak bisa menangkap error yang dilempar oleh throw() .

Kesalahan #3: Promises vs Promise factories

Dalam kasus ini, kita ingin menjalankan beberapa promises secara berurutan, secara sekuensial. Untuk kasus ini, kita pasti ingin memanfaatkan Promise.all() , tapi kita tidak ingin menjalankannya secara paralel. Kita mungkin akan menulis sebagai berikut:

Sayangnya promise dalam code tersebut tetap akan berjalan secara paralel, padahal kita menginginkannya berjalan secara sekuensial. Hal itu terjadi karena seketika promise dibuat, maka promise tersebut mulai dieksekusi.

Untuk mengatasi hal tersebut, kita dapat memanfaatkan pola promise factories. Contoh:

Pada fungsi di atas, ganti isi dariresult.then(...) dengan myPromiseFactory() . Pada fungsi di atas, promise factory tidak akan membuat promise baru sebelum diminta.

Kesalahan #4: Bagaimana jika membutuhkan hasil dari 2 promises

Sering kali kita membutuhkan hasil lebih dari 2 promise, contohnya:

Ada beberapa alternatif yang bisa kita gunakan.

Cara pertama adalah dengan menggunakan global variable.

Cara kedua, yang mungkin lebih baik, tapi dengan catatan mengabaikan rekomendasi di artikel sebelumnya.

Karena cara di atas akan berbentuk piramid, maka kita dapat memanfaatkan fungsi sebagai penggantinya.

Dengan cara di atas, maka indentasi dari code kita akan tetap terjaga dan lebih mudah dibaca.

Kesalahan #5: Promises fall through

Contoh yang paling sederhana untuk menjelaskan kesalahan ini adalah

Jika melihat code di atas dan menjawab hasil dari console.log(result) tersebut adalah bar , maka jawaban kita adalah salah!. Kenapa bisa begitu? Ketika kita melempar non-function (termasuk Promise.resolve() ) ke dalam .then() , maka akan diinterpretasikan sebagai .then(null) dan mengakibatkan promise tersebut menjadi gagal. Untuk itu, kita dapat memperbaiknya dengan cara:

Dengan code di atas, maka hasil yang diperoleh adalah bar .

Setelah memahami sedikit banyak tentang Promise, diharapkan kita bisa meminimalisir penggunaan callback dan menggunakan Promise dengan benar. Dengan beralih ke Promise, diharapkan code yang kita buat akan lebih simpel, mudah dibaca, dan lebih elegan.

Setelah memahami Promise, langkah selanjutnya adalah memahami tentang fitur async-await yang merupakan fitur dari ES7, yang akan saya bahas di artikel selanjutnya.

NB: Tulisan ini juga saya terbitkan di medium saya: https://medium.com/skyshidigital/kesalahan-penggunaan-promise-javascript-bagian-2-53dd49a1afa0

Tinggalkan Balasan