Comments 13
Promise.then(...).catch(...).then(/* Не то же самое? */)
Конкретно в приведенном случае- да, то же самое. Потому что значение промиса нигде не используется. А вот если оно используется, то так красиво сделать не получится. Попробуйте заменить вот это:
fetch("https://jsonplaceholder.typicode.com/todos/1")
.then(x => x.json())
.finally(() => console.log("request complete"))
.then(x => console.log("title: " + x.title))
.catch(x => console.error(x));
Не то же самое. catch тоже может кинуть экцепшн и тогда then не сработает.
Промисы прекрасны. Но вот раздражает, что нельзя завершить работу где-то в середине цепочки как-то кроме выбрасывания исключения.
Так можно же просто вернуть промис, который никогда не разрешится. Или я чего-то не понимаю?
А откуда такое требование — "как-то кроме выбрасывания исключения"? Чем исключение не устроило?
Или смущает не исключение, а сама операция throw
? В таком случае return Promise.reject(...)
в помощь.
Все таки исключения предназначены для ошибок и нештатных ситуаций. Иногда вполне штатно необходимо прекратить исполнения кода, например если обнаружится что некая сущность в базе данных помечена как удаленная. Я сейчас для этого создаю цепочку обернутую в анонимную функцию и в скопе этой функции делаю флаг и по состоянию этого флага в каждом зене определяю нужно ли делать код. Примерно так:
(()=>{
let STOP = false;
Promise...
.then(() => {
...
if (!user) return STOP = true;
}
.then(() => {
if (STOP) return;
...
}
})();
Лучше бы реализовали Promise.prototype.cancel() который реализован в том же Bluebird. Очень полезен в случаях когда установка стейта react-компонента уже неактуальна потому как компонент успел размонтироваться пока промис исполнялся.
одно из важнейших новшеств стандартаКоторое было еще во времена jQuery Deferred и Q ($q из первого angular). Для меня до сих пор остается загадкой, почему finally не вошел в стандарт с самого начала, ведь это удобная и сама-собой напрашивающаяся функция.
Sign up to leave a comment.
ES2018 — метод промисов finally