Tidak, tidak ada cara lain untuk melakukan ini - satu-satunya hal yang dapat saya katakan adalah bahwa use case ini tidak terlalu umum. Seperti yang dikatakan Felix dalam komentar - apa yang Anda lakukan akan konsisten bekerja.
Perlu disebutkan bahwa alasan konstruktor janji berperilaku seperti ini adalah keselamatan lemparan - jika pengecualian yang tidak Anda antisipasi terjadi saat kode Anda berjalan di dalam konstruktor janji, maka akan berubah menjadi penolakan, bentuk keselamatan lemparan ini - mengubah kesalahan yang dilemparkan ke penolakan adalah penting dan membantu mempertahankan kode yang dapat diprediksi.
Untuk alasan keamanan lemparan ini, konstruktor janji dipilih lebih dari yang ditangguhkan (yang merupakan cara konstruksi janji alternatif yang memungkinkan apa yang Anda lakukan) - seperti untuk praktik terbaik - saya akan meneruskan elemen dan menggunakan konstruktor janji sebagai gantinya:
var p = new Promise(function(resolve, reject){
this.onclick = resolve;
}.bind(this));
Untuk alasan ini - kapan pun Anda dapat menggunakan konstruktor janji daripada mengekspor fungsi - Saya sarankan Anda menggunakannya Setiap kali Anda dapat menghindari keduanya - hindari keduanya dan rantai.
Perhatikan, bahwa Anda tidak boleh menggunakan konstruktor janji untuk hal-hal seperti if(condition)
, contoh pertama dapat ditulis sebagai:
var p = Promise[(someCondition)?"resolve":"reject"]();
Promise
harus dijalankan secara serempak untuk memungkinkan "mengekspor" dua fungsi.