Задать вопрос
@steklovatnik

Почему setTimeout не работает в then?

Экспериментирую с промисами, не понимаю, что происходит.
По описаниям в интернете, then должен возвращать промис, но если я помещаю внутрь него setTimeout, то программа начинает вести себя странно.
Я ожидал, что промис сработает через 7 секунд, передаст 2 в then, который подождет 5 секунд и передаст новое значение дальше. При этом по факту проходит 1-2 секунды и скрипт завершается, возвращая 3. Откуда берется 3?

Почему промис срабатывает раньше, чем указано в setTimeout?
Почему setTimeout вообще не работает в then?

setTimeout(console.log(p), 6000); - тоже выводится не через 10 секунд, а одновременно с результатом выполнения промиса.

let p = new Promise((res, rej) => {
        setTimeout(res(2), 7000);
      })
        .then((data) => setTimeout(data + 4, 5000))
        .then((data) => console.log(data));

      setTimeout(console.log(p), 10000);
  • Вопрос задан
  • 176 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
RTFM. setTimeout не возвращает Promise. Она возвращает идентификатор таймаута.
Кроме того, setTimeout ожидает первым аргументом функцию. Вы же передаёте туда data + 4, что функцией явно не является
Ответ написан
Комментировать
Seasle
@Seasle Куратор тега JavaScript
let p = new Promise((res, rej) => {
    // Ждем 7сек; вызываем функцию res с аргументом 2
    setTimeout(res, 7000, 2);
})
    // Возвращаем новый промис; ждем 5сек; вызываем функцию res с аргументом 6 (2 + 4)
    .then((data) => new Promise((res) => setTimeout(res, 5000, data + 4)))
    .then((data) => console.log('data', data)); // 'data' 6

setTimeout(() => console.log(p), 10000); // Просто выведем промис
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Пока путаете функцию – с результатом её выполнения.
Смотрите, что передаётся первым аргументом в setTimeout():

setTimeout(console.log(p), 6000);
здесь передаётся результат вызова console.log()

setTimeout(console.log, 6000, p);
а вот тут передаётся функция console.log, которую setTimeout() вызовет с аргументом p через 6 секунд.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 17:26
5000 руб./за проект
18 дек. 2024, в 17:23
1500 руб./за проект
18 дек. 2024, в 16:42
2000 руб./за проект