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