2015-06-29 19 views
7

Ich stieß auf ein Problem in Bluebird/Promises. Für die Promise1 funktioniert alles gut, wenn Call Fullfill oder Reject. Wenn wir jedoch Promise2 in einem finally-Block zurückgeben, funktioniert es nur für die Zurückweisung, und für das Fullfil werden wir im Callback von undefiniert.Bluebird Versprechen - dann nach endlich

function getPromise1() { 
    return new Promise(function(fulfill, reject) { 
     fulfill("OK1"); 
    }); 
} 

function getPromise2() { 
    return new Promise(function(fulfill, reject) { 
     fulfill("OK2"); 
    }); 
} 


getPromise1() 
    .then(function(c){ 
     console.log(c); 
    }) 
    .catch(function(e) { 
     console.log(e); 
    }) 
    .finally(function() { 
     return getPromise2(); 
    }) 
    .then(function(c){ 
     console.log(c); 
    }) 
    .catch(function(e) { 
     console.log(e); 
    }); 

Ausgang:

OK1

undefined

Antwort

7

Der finally Block nicht den Rückgabewert ändern.

Es gibt spezielle Semantik für .finally(), da der endgültige Wert nicht vom Handler geändert werden kann.

Drossel wird darauf warten, aber es wird den Rückgabewert nicht ändern (dies ist eine eigenwillige Wahl und steht im Einklang mit der ECMAScript vorgeschlagenen Standard Semantik - wie finally in einigen Sprachen und im Gegensatz zu anderen).

0

Wenn Sie einen Handler unabhängig vom Ergebnis des vorherigen Versprechens verketten möchten, können Sie das Ergebnis mit .reflect() in ein PromiseInspection konvertieren.

Die offizielle Dokumentation ist here, obwohl es diesen Anwendungsfall zum Zeitpunkt dieses Artikels nicht wirklich klar macht.

besseres Beispiel:

Promise.resolve("OK1") 
    .then(function(x) { 
     console.log(x); // outputs OK1 
     return Promise.reject("Rejection demo"); 
    }) 
    .reflect() 
    .then(function(settled) { 
     if (settled.isRejected()) { 
      // outputs Rejected: Rejection demo 
      console.log("Rejected:", settled.reason()); 
     } 
     if (settled.isFulfilled()) { 
      console.log("Fulfilled:", settled.value()); // skipped 
     } 
     return Promise.resolve("OK2"); 
    }) 
    .then(function(c){ 
     console.log(c); // outputs OK2 
    }); 
Verwandte Themen