为了账号安全,请及时绑定邮箱和手机立即绑定

ES6里的Promise改进是重大的吗?

ES6里的Promise改进是重大的吗?

青春有我 2019-04-14 09:51:10
ES6的细节披露的越来越多了,最近听说里面增加了一个Promise特性,我去翻了下这个关键字,貌似在js上有很多实现了,那么es6的原生实现有什么不同?它的具体作用是什么呢?就是为了解决异步嵌套的问题吗?
查看完整描述

2 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

ES6的Promises是采用了Promises/A+提案的一种实现。你现在能够找到的各种第三方实现,如果是完全兼容了Promises/A+的,那么就和ES6的Promises是一致的(当然了,第三方实现可能会增加更多的API,而ES6的实现只需要符合Promises/A+提案的最基本要求即可)。
Promises是一种模式,它能够让异步操作变得看起来更像是同步的,无论是写起来还是读起来都会更愉悦更轻松一些。基本上它是把延续传递风格(Continuation-passingstyle)的代码,比如:
doSomeAsync("url",function(err,results){
//在延续传递的回调函数里处理err,或者处理results
});
变成返回值的形式:
varpromise=doSomeAsync("url")
这个返回的对象就是一个Promises对象,它代表着异步操作的结果:可能是成功的获取到某些数据,也可能是失败返回的状态和信息。在我们获得Promises对象的那一刻我们并无法知道具体是什么,但是只要异步操作完成,Promises对象必然会有一个确定状态(所以才叫Promises,也就是“许诺,承诺”)。我们甚至不需要去查询这个状态,只需要告诉它要做什么就可以了。
貌似延续传递的毁掉函数也能做到上述这些?没错。但是Promises的意义就在于它把未来的结果作为一个对象返回给你,你可以用同步的方式来写代码处理它,比如说作为参数传递,比如说聚合多个Promises操作等等。
解决异步嵌套并非Promises的目的,而是使用Promises后得到的一个副作用——当然是好的副作用。Promises真正的意义在于集中化处理异常。
什么意思呢?考虑一下同步函数,它的特点是要么返回值,要么抛出异常。返回的值可以继续传递给别的函数做进一步处理,而异常则可以在调用栈的某一层被捕获并处理。我们总认为异步回调的问题在于嵌套过深,然而嵌套只是表象,真正的难点在于你无法让异步回调统一处理返回值或异常,所以才不得不嵌套起来。
Promises把异步操作的结果变成对象返回出来并可以进一步处理,这就好像同步函数的经典行为,于是才可能有这样的异步处理:
varpromise=doSomeAsync("url");
promise
.then(doOneThingAsync)
.then(doAnotherThingAsync)
.then(doFinalThing)
.catch(dealWithAnyErrors);
链式调用的最后一个.catch,它可以处理前面三步中抛出的任意异常,这才是Promises的精髓:把异步操作同步化,因而不用嵌套回调函数并且能够集中处理异常。
补充一点,jQuery里实现的Promises是有问题的(和Promises/A+比较),而且问题比较严重。如果你希望使用Promises的习惯以及相关的API符合未来的ES6,那么请不要视jQuery的实现或行为是“正确的”,甚至根据jQuery核心成员的描述,这些问题将永远得不到解决(在jQuery中,出于向后兼容的考虑)。
                            
查看完整回答
反对 回复 2019-04-14
  • 2 回答
  • 0 关注
  • 293 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信