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中,出于向后兼容的考虑)。
添加回答
举报
0/150
提交
取消