Apakah ada yang salah?
Tapi polanya berhasil!
Beruntunglah anda. Sayangnya, mungkin tidak, karena Anda mungkin lupa beberapa tepi case. Dalam lebih dari setengah kejadian yang saya lihat, penulis lupa untuk mengurus penangan kesalahan:
return new Promise(function(resolve) {
getOtherPromise().then(function(result) {
resolve(result.property.example);
});
})
Jika janji lain ditolak, ini akan terjadi tanpa disadari alih-alih disebarkan ke janji baru (di mana janji itu akan ditangani) - dan janji baru itu tetap tertunda selamanya, yang dapat menyebabkan kebocoran.
Hal yang sama terjadi jika kode panggilan balik Anda menyebabkan kesalahan - misalnya ketika result
tidak memiliki property
dan pengecualian dilemparkan. Itu tidak akan ditangani dan meninggalkan janji baru yang belum terselesaikan.
Sebaliknya, menggunakan .then()
tidak secara otomatis menangani kedua skenario ini, dan menolak janji baru ketika terjadi kesalahan:
return getOtherPromise().then(function(result) {
return result.property.example;
})
Antipattern yang ditangguhkan tidak hanya rumit, tetapi juga rawan kesalahan . Menggunakan .then()
untuk chaining jauh lebih aman.
Tapi saya sudah menangani semuanya!
Betulkah? Baik. Namun, ini akan sangat rinci dan berlebihan, terutama jika Anda menggunakan perpustakaan janji yang mendukung fitur-fitur lain seperti pembatalan atau pengiriman pesan. Atau mungkin di masa depan, atau Anda ingin menukar perpustakaan Anda dengan yang lebih baik? Anda tidak akan ingin menulis ulang kode Anda untuk itu.
Metode perpustakaan ( then
) tidak hanya mendukung semua fitur secara asli, mereka juga mungkin memiliki optimisasi tertentu. Menggunakannya kemungkinan akan membuat kode Anda lebih cepat, atau setidaknya memungkinkan untuk dioptimalkan oleh revisi perpustakaan di masa depan.
Bagaimana saya menghindarinya?
Jadi, setiap kali Anda menemukan diri Anda secara manual membuat Promise
atau Deferred
dan sudah ada janji yang terlibat, periksa API perpustakaan terlebih dahulu . Antipattern yang ditangguhkan sering diterapkan oleh orang-orang yang melihat janji [hanya] sebagai pola pengamat - tetapi janji lebih dari sekadar panggilan balik : mereka seharusnya dapat dikomposasikan. Setiap perpustakaan yang layak memiliki banyak fungsi yang mudah digunakan untuk komposisi janji-janji dalam setiap cara yang dapat dipikirkan, mengurus semua hal tingkat rendah yang tidak ingin Anda tangani.
Jika Anda menemukan kebutuhan untuk menyusun beberapa janji dengan cara baru yang tidak didukung oleh fungsi pembantu yang ada, menulis fungsi Anda sendiri dengan Deferred yang tidak dapat dihindari harus menjadi pilihan terakhir Anda. Pertimbangkan beralih ke perpustakaan yang lebih berfitur, dan / atau ajukan bug pada perpustakaan Anda saat ini. Pemeliharanya harus dapat memperoleh komposisi dari fungsi yang ada, menerapkan fungsi pembantu baru untuk Anda dan / atau membantu mengidentifikasi kasus tepi yang perlu ditangani.
getStuffDone
pembungkus fungsi dan hanya menggunakan literal Janji?