最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

如何在Promise之前调用此setTimeout?

IT培训 admin 11浏览 0评论

如何在Promise之前调用此setTimeout?

因此,我一直在研究事件循环以及过去一天的微型/宏观任务队列。而且我已经看到许多人对以下代码有直接的矛盾:

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。

但是运行它之后,这实际上是错误的吗?我在这里缺少什么吗?为什么合格的讲师会这么说,我几乎可以肯定,我缺少了至关重要的信息。

[我的想法是,只有已解决的Promise将被推送到微任务队列,而所有待处理的Promise将不得不等待,直到将来的事件循环为止。

我想念的是什么?

回答如下:

我认为只有在WebApis或其他线程处理了异步部分并且只有回调被推入队列之后,才能将异步任务推送到微/宏任务,这些回调将在主线程本身上运行。

由于fetch300ms附近,所以当堆栈为空时,在MicroTask队列中还没有promise回调,但是在宏中存在SetTimeout一个。

如何在Promise之前调用此setTimeout?

因此,我一直在研究事件循环以及过去一天的微型/宏观任务队列。而且我已经看到许多人对以下代码有直接的矛盾:

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。

但是运行它之后,这实际上是错误的吗?我在这里缺少什么吗?为什么合格的讲师会这么说,我几乎可以肯定,我缺少了至关重要的信息。

[我的想法是,只有已解决的Promise将被推送到微任务队列,而所有待处理的Promise将不得不等待,直到将来的事件循环为止。

我想念的是什么?

回答如下:

我认为只有在WebApis或其他线程处理了异步部分并且只有回调被推入队列之后,才能将异步任务推送到微/宏任务,这些回调将在主线程本身上运行。

由于fetch300ms附近,所以当堆栈为空时,在MicroTask队列中还没有promise回调,但是在宏中存在SetTimeout一个。

发布评论

评论列表 (0)

  1. 暂无评论