No, no hay otra forma de hacer esto; lo único que puedo decir es que este caso de uso no es muy común. Como dijo Félix en el comentario, lo que hagas funcionará constantemente.
Vale la pena mencionar que la razón por la cual el constructor de promesas se comporta de esta manera es la seguridad de lanzamiento: si una excepción que no anticipó sucede mientras su código se ejecuta dentro del constructor de promesas, se convertirá en un rechazo, esta forma de seguridad de lanzamiento: la conversión de errores arrojados a Los rechazos son importantes y ayudan a mantener un código predecible.
Por esta razón de seguridad de lanzamiento, el constructor de la promesa se eligió entre los diferidos (que son una forma alternativa de construcción de la promesa que permite lo que está haciendo), en cuanto a las mejores prácticas, pasaría el elemento y usaría el constructor de la promesa en su lugar:
var p = new Promise(function(resolve, reject){
this.onclick = resolve;
}.bind(this));
Por esta razón, siempre que pueda usar el constructor de promesas antes de exportar las funciones, le recomiendo que lo use. Siempre que pueda evitar ambos, evite ambos y la cadena.
Tenga en cuenta que nunca debe usar el constructor de promesas para cosas como if(condition)
, el primer ejemplo podría escribirse como:
var p = Promise[(someCondition)?"resolve":"reject"]();
Promise
debe ejecutarse sincrónicamente para permitir "exportar" las dos funciones.