Warum ist das Versprechen, das noch aussteht?
Den folgenden code gibt:
output.isPending?: true
output.isRejected?: false
output.isFulfilled?: false
Warum? Ich hatte erwartet output.isRejected
zu true
.
<html>
<head>
<script src="http://cdnjs.cloudflare.com/ajax/libs/q.js/0.9.7/q.js"></script>
<script src="http://jasmine.github.io/2.3/lib/jasmine.js"></script>
</head>
<body>
</body>
<script>
var output, bar;
bar = {
doSomethingAsync: function() {
var d = Q.defer();
d.resolve('result');
return d.promise;
}
};
function Foo(bar) {
this._bar = bar;
this.go = function() {
var deferred = Q.defer();
this._bar.doSomethingAsync()
.then(onSuccess.bind(this, deferred));
return deferred.promise;
}
};
function onSuccess(deferred, result) {
deferred.reject();
}
output = new Foo(bar).go()
.finally(function() {
console.log('output.isPending?:', output.isPending());
console.log('output.isRejected?:', output.isRejected());
console.log('output.isFulfilled?:', output.isFulfilled());
});
</script>
</html>
InformationsquelleAutor Ben | 2015-05-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil
output
ist nichtnew Foo(bar).go()
. Es ist zugeordnet die Folge der.finally()
rufen, und wird nicht aufgelöst werden, bis diefinally
Rückruf erfolgt.Dies funktioniert wie erwartet:
If the handler returns a promise, outputPromise gets postponed.....
InformationsquelleAutor Bergi
Ich stehe korrigiert eine triviale delay-Funktion ist unnötig, sogar für die API, die blind sind gegenüber zu Versprechen. Ich kann machen, dass die
resolve
oderreject
wird immer aufgerufen werden, aber nachdem das Versprechen, sich selbst zurückgegeben, ohne Verzögerung. Hier ist ein Beispiel:resolve
oderreject
nur nach der Rückkehr ein Versprechen. Alle Rückrufe werden asynchron aufgerufen wird, sowieso, unabhängig davon, Wann/wie lösen Sie Ihre Versprechen. Mit deferreds wie dies auch sieht ein bisschen wie der Allgemeine antipattern.Dieser code ermöglicht trotzdem verspricht verkettet werden, zB:
exports.someCall = function(req,res) { somePromise('path') .then(function (result) { return somePromise('new path'); }).then(function (result) { ... do something else ...
Ja tut es, aber die
q.delay(1)
noch nicht?Wie erwähnt über das die Konvertierung eines API-Versprechen brauche ich, um eine sehr langsame HTTP-Aufrufe, die nicht über Ihre eigenen wrapper für verspricht. Die Verzögerung erlaubt mir, erstellen Sie eine Liste der teuer HTTP-Aufrufe und verwenden Sie dann
q.allSettled
warten, bis die Ergebnisse kommen.Ich stehe korrigiert, entfernen der
q.delay(1)
verursacht keine Probleme. Ich habe einige schlechten Gewohnheiten, die Links von der alten C TCP-API.InformationsquelleAutor Michael Shopsin