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 dasthenie @ -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.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage