Verkettung mehrerer done() callbacks, um die gleiche latente Versprechen
Kurz gesagt, ich würde gerne einen Allgemeinen Rückruf, der immer feuert im Falle einer erfolgreichen ajax-Aufruf, gefolgt von separaten Rückruf-Funktionalität, abhängig davon, wo die Methode aufgerufen wird.
Diese scheint zu funktionieren. Meine Frage ist, ob dies eine korrekte Verwendung des promise-Objekt, und wenn es ist sicher anzunehmen, dass mehrere Versprechen Rückrufe des gleichen Typs immer-stack-sequentiell?
var dfd = $.Deferred(),
promise = dfd.promise();
promise.done(function(){
console.log(1);
}).done(function(){
console.log(2);
});
dfd.resolve();
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine korrekte und dokumentierte Verwendung des deferred-Objekts in jQuery. Die Dokumentation klar:
Funktioniert es anders als in anderen Versprechen Bibliotheken und in der Regel
.then
bevorzugt.done
sowieso (später erklärt Sie in der Antwort). Aber gegeben sind Sie mit jQuery verspricht, es werden Stapel nur fein nacheinander, wenn Sie synchron.Also die direkte Antwort auf Ihre Frage ist ja.
Jedoch, Sie können dies auch tun, mit asynchrone code eingeben und Kette besser mit
.then
:Grundsätzlich
done
fügt einen handler und wieder die gleichen Versprechen und die.then
gibt ein neues Versprechen gekettet, von der letzten. Im Allgemeinen würde ich nur verwenden.done
zu beenden, Ketten und wenn Sie möchten, halten Sie die return-Wert (das argument derfunction(){
)generally .then is preferred to .done anyway
ich nehme an, Sie beziehen sich auf die Verkettung, und nichtdone
vsthen
im Allgemeinen? Ich denke, die meisten geeigneten Ansatz, basierend auf Ihren Kommentar, würdethen()
gefolgt von einem "Abbruch"done()
, obwohl ich nur den Umgang mit synchronen code in diesem Fall?then
zudone
bei der Verwendung von neuen Versprechen Bibliotheken. In jQuery auf der anderen Seite mit.done
zu beenden, die Kette ist von Vorteil - ja, dann wieder, dass ist nicht das größte Problem mit jQuery verspricht.then()
Anrufe. (warte mit meinen upvote, bis dies geklärt ist 🙂.done
nimmt einen Rückruf und gibt das gleiche Versprechen. In anderen Bibliotheken, wie Q und Bluebird.done
nimmt nichts und nichts zurückgibt. In jQuery ist es verwendet, um Ketten-Handler, um das Ergebnis - in den anderen Bibliotheken in beendet die Versprechen Kette und protokolliert alle unbehandelten Ablehnungen - jQuery nicht wirklich umgehen Ablehnungen auch in seinen Verheißungen. Das ist es, was ich meinte, denke ich.done
funktioniert anders", nicht "- Sequenz ist anders".