Что такое ES6 Promise, эквивалентный «всегда» jQuery Deferred?

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

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

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

Из этой статьи я понял, что я могу преобразовать объект Deferred в собственный 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)

person user5325596    schedule 01.10.2015    source источник


Ответы (2)


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

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

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

person Oleksii Rudenko    schedule 01.10.2015
comment
Да, это сработает, спасибо. Вы также заставили меня понять, что я также могу просто сделать Promise.resolve(getUser("foo")).then(handleSuccess).catch(handleError).then(tidyUp), то есть сохранить catch. - person user5325596; 01.10.2015

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

person reergymerej    schedule 14.04.2016