Как этот setTimeout вызывается перед Promise? - PullRequest
1 голос
/ 08 мая 2020

Итак, я изучал событие l oop и очереди микро / макро задач за последний день. И я видел прямые противоречия со стороны нескольких людей по поводу следующего кода:

setTimeout(() => console.log("A"), 0);

const futureData = fetch('someUrl') // assume this takes 300ms
futureData.then(x => console.log("B"))

console.log("C")

// output -> C, A, B
// what multiple JS instructors says the output will be -> C, B, A

Фактический результат, который я получаю, написан выше. Однако в курсе, который я беру, инструкторы утверждают, что, поскольку futureData является обещанием, оно помещается в очередь микрозадач, а поскольку оно помещается в очередь микрозадач, оно будет выполнено первым перед любым макро-задачи, такие как setTimeout.

Но после запуска это буквально ложь? Что-то мне здесь не хватает? Почему квалифицированные инструкторы говорят это? Я почти уверен, что упускаю важную информацию.

Я считаю, что только решенные обещания будут помещены в очередь микрозадач, в то время как все ожидающие выполнения обещания должны будут ждать до будущего события l oop раундов.

Что мне не хватает?

1 Ответ

1 голос
/ 08 мая 2020

Я думаю, что передача асинхронных задач в микро / макро-задачи будет выполняться только после того, как WebApis или другие потоки обработают асинхронную часть, и только обратный вызов будет помещен в очереди, эти обратные вызовы будут выполняться в самом основном потоке.

Поскольку fetch принимает около 300ms, когда стек пуст, обратный вызов обещания еще не присутствует в очереди MicroTask, но SetTimeout присутствует в макросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...