var resolver = Promise.defer();
setTimeout(function() {
resolver.resolve(something); // Resolve the value
}, 5000);
return resolver.promise;
Diese Linie ziemlich oft in den documentation verwendet wird.
Beachten Sie, dass dies in der Regel ein Anti-Pattern ist, das zu verwenden. Aber wenn Sie wissen, was Sie tun, ist Promise.defer()
eine Möglichkeit, den Resolver zu erhalten, der ähnlich wie Q ist.
Es wird jedoch davon abgeraten, diese Methode zu verwenden. Bluebird hat es sogar abgeschrieben.
Stattdessen sollten Sie auf diese Weise verwenden:
return new Promise(function(resolve, reject) {
// Your code
});
Siehe die entsprechenden Bits Dokumentation: Promise.defer() und new Promise().
Nach der Aktualisierung Ihrer Frage, hier ist Ihr Problem: Sie verwenden das gleiche Versprechen, um mehrere Werte zu lösen. Ein Versprechen kann nur einmal gelöst werden. Es bedeutet, dass Sie Promise.defer()
so oft verwenden müssen, wie Sie versprechen.
Das heißt, nachdem Sie mehr von Ihrem Code gesehen haben, scheint es, dass Sie wirklich Anti-Muster verwenden. Ein Vorteil der Verwendung von Versprechen ist die Fehlerbehandlung. Für Ihren Fall würden Sie den folgenden Code nur brauchen:
var gitControl = Promise.promisifyAll(Main.gitControl);
var promises = [];
promises.push(gitControl.gitAddAsync(fileObj.filename, updateIndex));
return promises;
Dies soll Ihren Anwendungsfall zu behandeln genug sein, um zu. Es ist viel klarer, und es hat auch den Vorteil, wirklich die Fehler richtig zu behandeln.
FYI die 'q' Funktion ist die gleiche wie' Promise.cast' während 'Promise' Funktion ist die gleiche wie' q.promise' . Also ist das Äquivalent von 'q()' 'Promise.cast()' – Esailija