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