Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[js] 第651天 Promise和setTimeout执行先后有什么区别? #3486

Open
haizhilin2013 opened this issue Jan 25, 2021 · 4 comments
Open
Labels
js JavaScript

Comments

@haizhilin2013
Copy link
Collaborator

第651天 Promise和setTimeout执行先后有什么区别?

3+1官网

我也要出题

@haizhilin2013 haizhilin2013 added the js JavaScript label Jan 25, 2021
@AlphaYoung111
Copy link

Promise属于正常自上而下的执行,但是Promise().then()则是微任务,setTimeout属于宏任务,在js单线程的执行中,先执行正常自上而下顺序的任务(大体上是非异步任务),碰到宏任务和微任务推送到各自的队列中,正常自行完毕,在执行当前推进到微任务队列的操作,最后在执行宏任务

@xujs0813
Copy link

Promise 和 setTimeout 都是异步代码。JS会先执行同步代码,待主线程清空后开始轮询任务队列的异步任务。

Promise 开启的异步任务在 resolve / reject 后推入到微任务队列,setTimeout 开启的异步任务会在计时结束后推入到宏任务队列。

轮询时会先将微任务队列中的待执行任务推入到主线程中执行。微任务队列清空后将宏任务队列的任务推入到主线程执行。

@my-csl
Copy link

my-csl commented Jan 26, 2021

浏览器的event loop机制
js是单线程的,所有的同步任务都会在主线程中去执行

等所有同步任务都执行完以后,会“依次”读取任务队列里面的事件,与之对应的就是异步任务进入主线程,开始执行

异步任务之间会存在差异,所以他们执行的优先级也不同。异步任务分为宏任务(setTimeout……)和微任务(promise……),宏任务的优先级会比微任务的优先级高

每一个宏任务执行完毕都必须把里面的微任务清空

假如在一个script标签里面有个setTimeout和promise,setTimeout在前。执行顺序为先执行promise里面的数据,再执行promise下面的代码(假如下面还有代码),然后执行promise的then里面的内容,最后执行setTimeout里面的内容。

因为浏览器碰到script标签会执行里面所有的代码作为第一个宏任务,后面遇到setTimeout是第二个宏任务,虽然promise里面的代码是同步任务但是promise的then却是一个微任务。作为第一个宏任务里面的微任务,会在宏任务结束之前执行,所以会比setTimeout先执行,最后执行第二个宏任务setTimeout

@Monica-lee99
Copy link

Promise是同步执行的,Promise().then()里面的回调是异步执行的,属于微任务,setTimeout属于宏任务,JS首先执行主线程代码,当遇到Promise,会立即执行,此时then方法被加到微任务队列,继续往下走,遇到setTimeout,setTimeout被加入宏任务队列,然后线程会去找是否还有微任务未执行完,如果存在微任务,先执行完微任务,然后执行完微任务,会继续找是否又有新的微任务,直到微任务队列清空,然后去宏任务队列执行宏任务。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js JavaScript
Projects
None yet
Development

No branches or pull requests

5 participants