Nie, nie ma innego sposobu, aby to zrobić - jedyne, co mogę powiedzieć, to to, że ten przypadek użycia nie jest zbyt powszechny. Jak powiedział Felix w komentarzu - to, co robisz, będzie konsekwentnie działać.
Warto wspomnieć, że powodem, dla którego konstruktor obietnicy zachowuje się w ten sposób, jest bezpieczeństwo rzucania - jeśli wyjątek, którego się nie spodziewałeś, zdarzy się, gdy Twój kod działa wewnątrz konstruktora obietnicy, zmieni się w odrzucenie, ta forma bezpieczeństwa rzucania - konwertuje zgłoszone błędy na odrzucenia są ważne i pomagają utrzymać przewidywalny kod.
Z tego powodu rzutu bezpieczeństwa wybrano konstruktora obietnicy zamiast odroczenia (które są alternatywnym sposobem budowania obietnicy, który pozwala na to, co robisz) - tak jak w przypadku najlepszych praktyk - przekazałbym element i zamiast tego użyłem konstruktora obietnicy:
var p = new Promise(function(resolve, reject){
this.onclick = resolve;
}.bind(this));
Z tego powodu - w dowolnym momencie można użyć konstruktora obietnica na eksporcie funkcje - polecam zrobić z niego korzystać. Ilekroć możesz uniknąć obu - unikaj obu i łańcucha.
Zauważ, że nigdy nie powinieneś używać konstruktora obietnic do takich rzeczy if(condition)
, pierwszy przykład można zapisać jako:
var p = Promise[(someCondition)?"resolve":"reject"]();
Promise
musi być wykonywane synchronicznie, aby umożliwić „eksportowanie” dwóch funkcji.