@GNG999

Как работает finally и then в Promise?

Есть вот такая функция в коде
fetch(`/api/checkout/${method}?` + new URLSearchParams({ service: id }), {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(buildRequestBody(values, cartStore, mapStore)),
        })
            .then((response) => response.json())
            .then(({ cart }) => cartStore.setCart(cart))
            .finally(() => setPreloader(false));
    };

разве тут then
then
finally не гарантирует того, что код будет ждать все это - те после того, как обработаются then и finally - код пойдет дальше ?
  • Вопрос задан
  • 232 просмотра
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Смотря о каком коде вы говорите. response.json() будет ждать окончания запроса, setCart будет ждать json, setPreloader будет ждать их обоих или падения.
Но если вы что-то напишете вне then, после fetch, оно ничего ждать не будет (если бы так работало, то зачем вообще нужен был бы then?).
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Никто ничего ждать не будет. Исполнение кода пойдёт дальше до самого конца функции.
Когда промис, который вернул fetch, перейдёт в состояние resolved, в очередь микротасков будет добавлен вызов каллбэк-функции из первого then. Если промис вернёт rejected, то вызова не будет, вернётся новый промис в rejected.
Когда промис из первого then перейдёт в состояние resolved, в очередь микротасков будет добавлен вызов каллбэк-функции из второго then. Если промис вернёт rejected, то вызова не будет, вернётся новый промис в rejected.
Когда промис из второго then перейдёт в состояние resolved или rejected, в очередь микротасков будет добавлен вызов каллбэк-функции из finally.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@iljaGolubev
fetch(url)
    .then((response) => response.json())
    .then(({ cart }) => cartStore.setCart(cart))
    .catch(e=>console.log(e))
    .finally(() => setPreloader(false));

finally выполнится после того как fetch и цепочка then(catch) выше полностью выполнится.
Независимо от результата.
По сути, это тоже самое что написать
fetch(url)
    .then((response) => response.json())
    .then(({ cart }) => {cartStore.setCart(cart); setPreloader(false)} )
    .catch(e=>{console.log(e); setPreloader(false)})
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы