面试教训:对于异步的思考

对于异步的思考
  • 今天面试的时候,面试官的一个问题直接指出了我的盲区,一直以来,对于javascript异步执行原理我一直不是特别明白,面试官真是一阵见血
  • 在《你不知道的js 中卷》里有说明这么一个问题:对于javascript的异步和回调函数的使用之所以这么难理解,最直接的原因是因为我们的大脑更喜欢顺序执行的代码,但是异步执行或者说回调函数会让代码的执行顺序很乱,会让代码很难理解并进行维护
  • 说句实在话,如果遇见很多的异步代码我头就大
setTimeout(()=>{
    console.log("header...")
},0)

var p = new Promise(function(resolve,reject){
    console.log("before...")
    resolve(3)
    console.log("after...")
}).then(function(data){
    console.log(data)
})

console.log("footer")
  • 思考这段代码的执行结果会是什么?
    在这里插入图片描述
  • 再看看这个
setTimeout(()=>{
    console.log("header...")
},0)

var p = new Promise(function(resolve,reject){
    console.log("before...")
    resolve(3)
    console.log("after...")
}).then(function(data){
    console.log(data)
    return 4
}).then(function(data){
    console.log(data)
    return 5
}).then(function(data){
    console.log(data)
})

console.log("footer")

在这里插入图片描述

  • 可以看见,promise里边的then实际上就是一个异步的方法,但是他的“优先级”比延时函数setTimeOut要高,这里面一定有原因的,但是我找了很多的promise源码,试过之后,发现还是不符合promise的定义
  • 我之前尝试性的写的仿promise,then实际上是同步的,而不是异步的,某种意义上说没能成功还原原生的promise
setTimeout(()=>{
    console.log("header...")
},0)
new Opromise(function(resolve,reject){
    console.log("before...")
    resolve(4)
    console.log("after...")
}).then(function(data){
    console.log(data)
})
console.log("footer...")

在这里插入图片描述

  • 可以看见,没能实现promise原本的异步
  • 真正的promise
setTimeout(()=>{
    console.log("header...")
},0)
new Promise(function(resolve,reject){
    console.log("before...")
    resolve(4)
    console.log("after...")
}).then(function(data){
    console.log(data)
})
console.log("footer...")

在这里插入图片描述

  • 对比一下两个结果:
    在这里插入图片描述
  • ^这是仿promise
    在这里插入图片描述
  • ^这是真正的promise
  • 看来还得好好研究了…
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值