Sama sekali tidak ada yang salah dengan penolong yang melakukan penangguhan selama Anda yakin memang membutuhkan penangguhan. Dalam semua pemrograman janji saya, saya hanya menemukan satu situasi di mana saya benar-benar memerlukan penundaan dan tidak bisa begitu saja merestrukturisasi kode saya untuk menggunakan pola konstruktor Promise yang khas.
Tampaknya situasi yang saya temukan dan yang ditunjukkan orang lain terjadi ketika Anda memiliki pemisahan antara kode yang membuat objek janji/penangguhan dan kode yang menyelesaikan atau menolaknya. Biasanya, Anda memilikinya bersama-sama, namun terkadang ada bagian kode yang benar-benar berbeda dan ada alasan logis untuk melakukannya seperti itu. Dalam kasus tersebut, objek yang ditangguhkan yang dibangun berdasarkan janji reguler dapat menjadi metode implementasi yang lebih bersih.
Berikut implementasi Deferred sederhana lainnya yang juga kompatibel ke belakang dan ke depan:
Mengapa konstruktor Promise memerlukan eksekutor?
Namun apakah ini praktik yang buruk?
Saya tahu ada beberapa orang puritan di luar sana yang berpikir Anda tidak boleh melakukan ini. Namun, menurut saya ini adalah praktik yang sangat bagus jika Anda yakin bahwa ini adalah cara paling bersih dan paling sederhana untuk mengimplementasikan kode Anda dan mengimplementasikannya dengan callback eksekutor konstruktor Promise yang khas tidaklah praktis. Ada orang-orang yang ingin menggunakan deferred bahkan tanpa mencoba atau mempelajari konstruktor/pelaksana janji dan itu bukan praktik yang baik. Karena berbagai alasan, konstruktor janji harus digunakan jika praktis.
Salah satu alasan utama mengapa konstruktor janji lebih disukai adalah karena semua kode khusus janji dalam fungsi panggilan balik pelaksana bersifat "aman". Jika pengecualian dimasukkan ke dalam kode itu, maka secara otomatis akan ditangkap dan menolak janji (yang merupakan hal yang baik). Setelah Anda menggunakan deferred dan memiliki banyak kode yang memanipulasi janji di luar panggilan balik itu, itu tidak secara otomatis aman untuk dibuang. Faktanya, kode Anda bahkan dapat muncul secara serempak yang merupakan mimpi buruk bagi penelepon untuk dilindungi. Anda dapat melihat deskripsi masalah tersebut di sini: https://stackoverflow.com/a/37657831/816620. Jadi, pola yang ditangguhkan tidak disukai, namun dengan perlindungan yang tepat, masih ada beberapa kasus (umumnya jarang terjadi) yang mengarah pada penerapan yang lebih bersih.
Apakah ada pola yang dikenal dan lebih baik?
Jawabannya kurang lebih sama seperti di atas. Preferensinya adalah menggunakan konstruktor/pelaksana janji, tetapi dalam situasi di mana hal itu tidak praktis (biasanya ketika bagian kode yang berbeda membuat janji dan kemudian menyelesaikan/menolaknya) dan tidak ada cara sederhana untuk mengatur ulang kode agar berfungsi dengan baik konstruktor/pelaksana janji, maka objek yang ditangguhkan kemungkinan merupakan implementasi yang lebih disukai. Biasanya Anda akan menemukan situasi tersebut jarang terjadi karena sebagian besar waktu Anda dapat menyusun kode Anda sehingga potongan kode yang sama membuat dan menyelesaikan/menolak janji dan Anda tidak memerlukan penundaan.
Apa persamaan idiomatis dari TaskCompletionSource di JavaScript?
Tidak ada padanan bawaan dalam Javascript. Oleh karena itu, Anda harus membuatnya sendiri dan sepertinya janji adalah cara alami untuk melakukannya karena janji tersebut secara alami dibuat untuk menandakan penyelesaian atau kesalahan. Anda harus menunjukkan kepada kami kode Anda yang sebenarnya agar kami dapat memberikan pendapat tentang apakah situasi spesifik Anda dapat diimplementasikan dengan baik tanpa menggunakan objek yang ditangguhkan.
person
jfriend00
schedule
01.08.2016