Что такое эквивалент обещания 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)
Ответы
Ответ 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