setTimeout выполняется перед задачей в очереди микро-задач (очередь заданий) - PullRequest
0 голосов
/ 19 февраля 2019

У меня возникают проблемы с пониманием того, почему мой код ниже регистрирует следующее по порядку: "конец", "тайм-аут завершен", "обещание"

Я предполагал, что "обещание" будет регистрироваться до "тайм-аута сделано", так как онимеет приоритет над задачей очереди обратного вызова (setTimeout).Мое предположение после этого наблюдения состоит в том, что до тех пор, пока не будет вызван .hen, обещание не ставит свою задачу в очередь, поскольку оно еще не готово, и, таким образом, позволяет setTimeout выполнить в очереди обратного вызова для выполнения в первую очередь.Это правильно?

const sampleFunction = function(e) {
  setTimeout(() => console.log('timeout done'), 0)
  const data = fetch(`https://jsonplaceholder.typicode.com/comments/1`)
  .then(response => {
    return response.json();
  })
  .then(json => {
    /*doSomething*/
    console.log('promise')
  });
  console.log('end')
}

1 Ответ

0 голосов
/ 19 февраля 2019

Ваш console.log('promise') должен ждать, пока ваш fetch().then() не будет завершен, что включает сетевую операцию с другим хостом (и, следовательно, ненулевое время).

Ваш setTimeout() должен только ждать, пока не вернется sampleFunction() и вы не вернетесь в очередь событий.Таким образом, поскольку fetch().then() неблокирует и занимает ненулевое количество времени, когда вы впервые вернетесь в очередь событий, только setTimeout() готов к работе.Работа в сети по-прежнему будет выполняться в фоновом режиме.

Итак, это не вопрос определения приоритетов.Это вопрос выполнения заказа.setTimeout() вставляет событие завершения в очередь событий задолго до того, как обещание fetch() разрешено.

Возможно, вы не осознавали, что fetch() неблокирует, и вызов его просто инициирует операцию ипосле этого выполнение вашего кода продолжается?

В консоли вы должны увидеть:

end
timeout done
promise

Пока ваш fetch() не содержит ошибок.

...