setTimeout在微任务队列(作业队列)中的任务之前执行

时间:2019-02-18 23:11:14

标签: javascript asynchronous callback es6-promise ecmascript-7

我无法理解为什么我的以下代码按顺序记录以下内容: “结束” “超时完成” “承诺”

我认为“承诺”将在“超时完成”之前记录,因为它比回调队列任务(setTimeout)优先。 根据这一观察,我的假设是直到调用.then之前,promise不会排队,因为它尚未准备好,因此允许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 :(得分:0)

您的console.log('promise')必须等待,直到完成fetch().then(),这涉及到另一台主机的联网操作(因此是非零时间)。

您的setTimeout()只需要等到sampleFunction()返回并返回事件队列即可。因此,由于fetch().then()是非阻塞的,并且花费的时间也不为零,因此当您第一次返回事件队列时,只有setTimeout()可以使用了。联网操作仍将在后台进行。

因此,这不是优先事项。这是完成顺序的问题。 setTimeout()在解决fetch()承诺之前很久就将其完成事件插入事件队列。

也许您没有意识到fetch()是非阻塞的,调用它只是启动操作,然后代码执行会继续吗?

在控制台中,您应该看到:

end
timeout done
promise

只要您的fetch()没有任何错误。