【读书笔记】--浏览器工作原理与实践(使用Promise告别回调函数)

promise解决了什么问题?解决了异步编码风格的问题。

第一是嵌套调用,下面的任务依赖上个任务的请求结果,并且在上个任务的回调函数内部执行新的业务逻辑,这样嵌套层次多了以后,代码可读性变差

第二是任务的不确定性,执行每个任务都可能有两种结果,所以体现在代码中就需要对每个任务的执行结果做两次判断,这种对每个任务都需要进行一次额外的错误处理的方式,增加了代码的混乱程度

promise消灭了嵌套调用,合并了多个任务的错误处理。

多个promise嵌套,可以在最后一个promise里面进行异常捕获,这是因为promise对象的错误有冒泡性质,会一直向后传递,直到onreject函数或者catch捕获。

异步编程的问题: 代码逻辑不连续

页面中的任务都是执行在主线程之上的,相对于页面来说,主线程就是它整个的世界,所以在执行一项耗时任务,比如下载网络文件任务,获取摄像头等设备信息等任务,这些任务都会被放到页面主线程之外的进程或者线程中去执行,这样就避免了耗时任务霸占主线程的情况。

web页面的单线程架构决定了异步回调,异步回调影响到了我们的编码方式。

promise与微任务

function executor(resolve, reject) { resolve(100) } let demo = new Promise(executor) function onResolve(value){ console.log(value) } demo.then(onResolve)

这段代码的执行顺序是这样的

首先执行 new Promise 时,Promise 的构造函数会被执行,不过由于 Promise 是 V8 引擎提供的,所以暂时看不到 Promise 构造函数的细节。

接下来,promise的构造函数会调用promise的executor函数,在executor函数中执行了resolve,执行executor会触发demo.then 设置的回调函数 onResolve,所以可以推测,resolve 函数内部调用了通过 demo.then 设置的 onResolve 函数。

由于 Promise 采用了回调函数延迟绑定技术,所以在执行 resolve 函数的时候,回调函数还没有绑定,那么只能推迟回调函数的执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值