setTimeout、promise、async await的区别

要了解以上的区别首先要了解任务队列的执行过程,以及宏任务和微任务的概念。

首先,任务队列的执行过程是:先执行一个宏任务,执行过程中如果产出新的宏 / 微任务,就将他们推入相应的任务队列,之后在执行一队微任务,之后再执行宏任务,如此循环。以上不断重复的过程就叫做事件循环

宏任务主要包括:scrip(JS 整体代码)、setTimeout、setInterval、setImmediate

微任务主要包括:Promise(重点关注)、process.nextTick(Node.js)、MutaionObserver

接下来就是以上的具体区别:

首先,setTimeout是异步执行函数 , 当js主线程运行到此函数时,不会等待setTimeout中的回调函数 ,会直接进行setTimeout下面的语句(尽管setTimeout的延迟时间为0时), 当执行完当前事件循环的时候,setTimeout中的回调会在下次事件循环中被执行

Promise 本身也是同步的立即执行函数,当在执行体中执行resolve()或者reject的时候,此时是异步操作,promise.then里的回调函数就会放到相应宏任务的微任务队列里,等宏任务里面的同步代码执行完再执行

async函数表示函数里面可能会有异步方法,await后面跟一个表达式,async方法执行时,遇到await会立即执行表达式,然后把表达式后面的代码放到微任务队列里,让同步代码先执行,也可以理解为 await 之前的代码相当于Promise中resolve()之前的同步代码, await 之后的代码相当于promise.then() 里面的代码

以上区别可以通过一段js代码进行理解:

async function async1() {

console.log('async1 start')

await async2()

console.log('async1 end')

}

async function async2() {

console.log('async2')

}

console.log('script start')

setTimeout(function () {

console.log('settimeout')

})

async1()

new Promise(function (resolve) {

console.log('promise1')

resolve()

}).then(function () {

console.log('promise2')

})

console.log('script end')

执行结果为:script start
async1 start
 async2
 promise1
 script end
 async1 end
 promise2
 settimeout

以上内容来源于网络搜索及个人理解,如有不正欢迎斧正,如有侵权可联系删除

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值