2015-10-01 6 views
23

Ich habe so etwas wie die folgenden:Was ist das ES6 Promise-Äquivalent von jQuery Defereds "immer"?

getUser("foo").then(handleSuccess, handleError).always(tidyUp); 

getUser gibt ein jQuery Latente Objekt.

Ich verstehe von this article, dass ich das latente Objekt zu einem nativen Versprechen umwandeln kann Promise.resolve verwenden, so kann ich

Promise.resolve(getUser("foo")) 
    .then(handleSuccess) 
    .catch(handleError) 

Die Promise API nicht bieten eine always Methode allerdings schreiben, so frage ich mich, wie das sollte behandelt werden.

Ist es wie folgt?

Promise.resolve(getUser("foo")) 
    .then(handleSuccess) 
    .then(tidyUp) 
    .catch(handleError) 
    .then(tidyUp) 

Antwort

19

Ich denke, die folgende ist das, was Sie suchen:

Promise.resolve(getUser("foo")) 
    .then(handleSuccess, handleError) 
    .then(tidyUp) 

TidyUp wird immer aufgerufen werden. Sehen Sie im folgenden jsbin für das Gesamt Beispiel: http://jsbin.com/lujubu/edit?html,js,console,output

+4

Ja, das wäre dank arbeiten. Sie haben mir auch klar gemacht, dass ich auch einfach 'Promise.resolve (getUser (" foo ")). Then (handleSuccess) .catch (handleError) .then (tidyUp)' machen kann, also den 'catch' behalten. – user5325596

3

Verwenden Sie Ihre always Funktion als Handler für resolveundreject, um sicherzustellen, es wird immer aufgerufen werden.

function getUser(result) { 
    switch (result) { 
     case 'good': 
      return Promise.resolve(); 

     case 'bad': 
      return Promise.reject(); 

     case 'ugly': 
      return new Promise(() => { throw new Error() }) 
    } 
} 

function handleSuccess() { console.log('success') } 
function handleError() { console.log('error') } 
function tidyUp() { console.log('all tidy now') } 


Promise.resolve(getUser('good')) 
    .then(handleSuccess) 
    .catch(handleError) 
    .then(tidyUp, tidyUp); 

Promise.resolve(getUser('bad')) 
    .then(handleSuccess) 
    .catch(handleError) 
    .then(tidyUp, tidyUp); 

Promise.resolve(getUser('ugly')) 
    .then(handleSuccess) 
    .catch(handleError) 
    .then(tidyUp, tidyUp); 

// success 
// error 
// error 
// all tidy now 
// all tidy now 
// all tidy now 

Promise API Reference