李恒道 发表于 2021-8-25 10:22:46

[油猴脚本开发指南]Promise执行顺序问题

# 同步代码与异步代码

js是一个单线程的编程语言,在执行过程中,通常按顺序往下执行,这种我们称之为同步代码。但是如果有些事情并不需要现在进行,比如我们可以post一条数据,在返回数据后自动调用回调的函数,这种情况就是属于异步代码了。

# 异步代码

异步代码又分为宏任务和微任务。

微任务有nextTick,Promise,MutationObserver等等

宏任务有setinterval,setTimeout等等。

由于属于基础教程,所以提供一个简单粗暴的结果:微任务听着就比宏任务小,所以微任务先执行,宏任务后执行。

我们来看一个demo

```javascript
console.log('主线程1')
new Promise(function(resolve, reject){
    console.log('创建Promise,也属于主线程')
    resolve('1')
}).then(function (data2){
   console.log('then属于微任务')
})
console.log('主线程2')
setTimeout(()=>{console.log('宏任务')},0)
```

![图片.png](data/attachment/forum/202108/25/101722xlzojy2pty0tynno.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

我们首先console

然后进入new promise,在new Promise的时候由于是创建Promise的过程,所以属于同步代码,会正常输出一个console

然后resolve了这个promise

then注册到了这个promise上,属于一个微任务。

往下在主线程搞了console输出

然后碰到了setTimeout,这是一个宏任务

所以代码执行完毕之后任务队列还有

then以及setTimeout

then属于微任务优先执行,所以先执行then,后执行setTimeout。

那么到这里你已经强行记下了宏微任务了!

常用的很多代码和骚操作其实都基于这个的,如果下次你碰到类似的代码就可以解释了。

# 结语

撒花~
页: [1]
查看完整版本: [油猴脚本开发指南]Promise执行顺序问题