Подтвердить что ты не робот

Что такое эквивалент обещания ES6 jQuery, отложенный "всегда"?

У меня есть что-то вроде следующего:

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

getUser возвращает объект jquery deferred.

Я понимаю из этой статьи, что я могу преобразовать объект Deferred в нативный Promise с помощью Promise.resolve, поэтому я могу написать

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

API обещаний не предлагает метод always, поэтому мне интересно, как это должно быть обработано.

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

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

Ответ 1

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

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

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

Ответ 2

Используйте функцию 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

Ссылка API Promise