Viele der Antworten hier ähneln dem letzten Beispiel in diesem Artikel. Ich zwischenspeichere mehrere Promises, und die resolve()
und reject()
Funktionen können einer beliebigen Variable oder Eigenschaft zugewiesen werden. Dadurch kann ich diesen Code etwas kompakter machen:
function defer(obj) {
obj.promise = new Promise((resolve, reject) => {
obj.resolve = resolve;
obj.reject = reject;
});
}
Hier ist ein vereinfachtes Beispiel für die Verwendung dieser Version von defer()
, um ein FontFace
Lade-Promise mit einem anderen asynchronen Prozess zu kombinieren:
function onDOMContentLoaded(evt) {
let all = []; // Array von Promises
glob = {}; // global verwendetes Objekt
defer(glob);
all.push(glob.promise);
// starte asynchronen Prozess mit Rückruf = resolveGlob()
const myFont = new FontFace("myFont", "url(myFont.woff2)");
document.fonts.add(myFont);
myFont.load();
all.push[myFont];
Promise.all(all).then(() => { runIt(); }, (v) => { alert(v); });
}
// ...
function resolveGlob() {
glob.resolve();
}
function runIt() {} // wird ausgeführt, nachdem alle Promises aufgelöst wurden
Update: 2 Alternativen, falls Sie das Objekt kapseln möchten:
function defer(obj = {}) {
obj.promise = new Promise((resolve, reject) => {
obj.resolve = resolve;
obj.reject = reject;
});
return obj;
}
let deferred = defer();
und
class Deferred {
constructor() {
this.promise = new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
});
}
}
let deferred = new Deferred();