2015-10-01 3 views
23

У меня есть что-то вроде следующего:Что такое эквивалент обещания ES6 от jQuery Deferred 'always`?

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

getUser возвращает JQuery Отложенный объект.

Я понимаю, из this article, что я могу преобразовать Отложенный объект в родной Promise с использованием Promise.resolve, так что я могу написать

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

Promise API не предлагает always метод, хотя, так что мне интересно, как которые должны быть обработаны.

Является ли это следующим?

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

ответ

19

Я думаю, что следующее, что вы ищете:

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

tidyUp будет всегда называется. Смотрите следующий jsbin для полного примера: http://jsbin.com/lujubu/edit?html,js,console,output

+4

Да, это будет работать, спасибо. Вы также заставили меня понять, что я также могу просто выполнить 'Promise.resolve (getUser (« foo »)), затем (handleSuccess) .catch (handleError) .then (tidyUp)', т. Е. Сохраняя 'catch'. – user5325596

3

always Используйте функцию в качестве обработчика для resolveиreject, чтобы гарантировать ее всегда будет вызываться.

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

Смежные вопросы