Promise.resolve () возвращает странный результат, когда в setTimeout () - PullRequest
0 голосов
/ 12 апреля 2020

1.

let f = Promise.resolve(15);
console.log(f);

f.then(v => console.log(v));

Результат:

[object Promise] { ... }
15

Все отлично работает как задумано ... но когда я подключаю его к функции setTimeout (), я не могу рассуждать почему результат 1 ...

2.

let f = Promise.resolve(setTimeout(() => Promise.resolve(15), 1000));
console.log(f);

f.then(v => console.log(v));

Результат:

[object Promise] { ... }

1

Спасибо!

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

В результате вы получите setTimeout timeoutID, номер, назначенный браузером для отслеживания всех отдельных вызовов setTimeout.

Ошибка, которую вы делаете, здесь :

let f = Promise.resolve(setTimeout(() => Promise.resolve(15), 1000));

Вы создаете Promise, который мгновенно разрешается с помощью Promise.resolve и мгновенно разрешается с помощью setTimeout(() => Promise.resolve(15), 1000). Вероятно, это первый тайм-аут в сценарии, поэтому timeoutID равен 1.

Вы хотите разрешить обещание с помощью 15, а не setTimeout[...]. То, что вы должны сделать для достижения результата, к которому вы стремитесь, это:

let f = new Promise(resolve => setTimeout(() => resolve(15), 1000));

То есть создайте новый Promise, который запускает новый setTimeout, который запускается через 1000 мс и разрешает содержащий Promise.

1 голос
/ 12 апреля 2020

setTimeout ничего не делает с возвращаемым значением функции обратного вызова, которую вы передаете. Ставить решительное обещание здесь совершенно неактуально.

Разрешенное значение внешнего обещания - это возвращаемое значение setTimeout.

Возвращенный timeoutID - это положительное целочисленное значение, которое идентифицирует таймер, созданный вызовом setTimeout ( ); это значение может быть передано clearTimeout () для отмены тайм-аута.

- MDN


Если вы хотите разрешить обещание через некоторое время затем используйте обычный конструктор обещаний.

const promise = new Promise(
    (res) => {
        const resolve = () => res(15);
        setTimeout(resolve, 1000);
    }
);

promise.then( value => console.log(value) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...