Nein, es gibt keinen anderen Weg, dies zu tun - das einzige, was ich sagen kann, ist, dass dieser Anwendungsfall nicht sehr häufig ist. Wie Felix im Kommentar sagte - was Sie tun, wird konsequent funktionieren.
Es ist erwähnenswert, dass der Grund, warum sich der Versprechen-Konstruktor so verhält, die Wurfsicherheit ist. Wenn eine Ausnahme, die Sie nicht erwartet haben, auftritt, während Ihr Code im Versprechen-Konstruktor ausgeführt wird, wird dies zu einer Ablehnung, dieser Form der Wurfsicherheit - Konvertieren von geworfenen Fehlern in Ablehnungen sind wichtig und helfen dabei, vorhersehbaren Code beizubehalten.
Aus Gründen der Wurfsicherheit wurde der Versprechenskonstruktor gegenüber verzögerten Konstruktionen ausgewählt (dies ist eine alternative Versprechungskonstruktionsmethode, die das erlaubt, was Sie tun). Was Best Practices betrifft, würde ich das Element übergeben und stattdessen den Versprechungskonstruktor verwenden:
var p = new Promise(function(resolve, reject){
this.onclick = resolve;
}.bind(this));
Aus diesem Grund - wann immer Sie können das Versprechen Konstruktor über den Export der Funktionen - Ich empfehle Ihnen , es zu verwenden. Wann immer Sie beides vermeiden können - vermeiden Sie beides und die Kette.
Beachten Sie, dass Sie den Versprechen-Konstruktor niemals für Dinge wie if(condition)
das erste Beispiel verwenden sollten, das wie folgt geschrieben werden könnte:
var p = Promise[(someCondition)?"resolve":"reject"]();
Promise
synchron ausgeführt werden muss, damit die beiden Funktionen "exportiert" werden können.