Ні, іншого способу це зробити не існує - єдине, що я можу сказати, це те, що цей випадок використання не дуже поширений. Як сказав у коментарі Фелікс - те, що ви робите, послідовно працюватиме.
Варто зазначити, що причиною того, як конструктор обіцянок поводиться таким чином, є безпека викидання - якщо виняток, якого ви не передбачали, трапиться, поки ваш код працює всередині конструктора обіцянок, він перетвориться на відмову, ця форма безпеки кидання - перетворення викинутих помилок у відхилення важливі і допомагають підтримувати передбачуваний код.
З цієї причини безпеки кидок конструктор обіцянок був обраний за відкладеними (які є альтернативним способом побудови обіцянок, які дозволяють робити те, що ви робите) - як для найкращих практик - я б передав елемент і використовував замість цього конструктор обіцянок:
var p = new Promise(function(resolve, reject){
this.onclick = resolve;
}.bind(this));
З цієї причини - щоразу, коли ви можете використовувати конструктор обіцянок для експорту функцій - я рекомендую вам використовувати його. Всякий раз, коли ви можете уникнути обох - уникайте обох і ланцюжок.
Зауважте, що ви ніколи не повинні використовувати конструктор обіцянок для таких речей, як if(condition)
перший приклад можна записати як:
var p = Promise[(someCondition)?"resolve":"reject"]();
Promise
повинен виконуватися синхронно, щоб дозволити "експортувати" дві функції.