Chaining Javascript verspricht
Ich versuche, Versprechen von der @ zu verstehMDN Dokumentation. Das erste Beispiel zeigt dasthen
undcatch
Methoden:
// We define what to do when the promise is resolved/fulfilled with the then() call,
// and the catch() method defines what to do if the promise is rejected.
p1.then(
// Log the fulfillment value
function(val) {
log.insertAdjacentHTML('beforeend', val +
') Promise fulfilled (<small>Async code terminated</small>)<br/>');
})
.catch(
// Log the rejection reason
function(reason) {
console.log('Handle rejected promise ('+reason+') here.');
});
Die Dokumentation besagt, dass dasthen
ie @ -Methode gibt ein neues Versprechen zurück. Sollte der obige Code also nicht mit @ übereinstimme
var p2 = p1.then(
// Log the fulfillment value
function(val) {
log.insertAdjacentHTML('beforeend', val +
') Promise fulfilled (<small>Async code terminated</small>)<br/>');
});
p2.catch(
// Log the rejection reason
function(reason) {
console.log('Handle rejected promise ('+reason+') here.');
});
?
Wenn ja, würde das dann nicht bedeuten, dass dascatch
callback wird nur aufgerufen, wenn das Versprechen von @ zurückgegeben wip1.then
, nicht das Versprechenp1
, beschlossen, abgelehnt? Und müsste ich das nicht tun:
p1.then( /* etc. */ );
// and for rejected resolutions
p1.catch( /* etc. */ );
ie Ablehnung des Versprechens zu fangp1
anstatt das @ zu verkettcatch
zumthen
?
uerst dachte ich, das Versprechen käme vonp1.then
war das gleiche wiep1
, wie es jQuery mit vielen seiner APIs macht. Aber das Folgende zeigt deutlich, dass die beiden Versprechen unterschiedlich sind.
var p1 = new Promise(function(resolve, reject) {
resolve("Success!");
});
console.log(p1);
// Promise { <state>: "fulfilled", <value>: "Success!" }
var p2 = p1.then(function(value) {
console.log(value);
});
// Success!
console.log(p2);
// Promise { <state>: "fulfilled", <value>: undefined }
Auch habe ich in JSFiddle mit den drei Ansätzen rumgespielt:
p1.then(onFulfilled).catch(onRejected);
p1.then(onFulfilled); p1.catch(onRejected);
p1.then(onFulfilled, onRejected);
Alle drei arbeiten. Ich kann die beiden letzteren verstehen. Der Kern meiner Frage ist, warum der erste Ansatz auch funktioniert.