Promise接口是AngularJS组织API的基础

已经看过了AngularJS是如何实现异步和deferred这两个API的。这里面,Promise接口是AngularJS组织API的基础。从根本上讲,Promise接口从以下方面对异步请求做出了规范:

步请求返回一个promise,而不是返回具体值。

Promise带有一个then函数,这个函数有两个参数:第一个参数是处理“resolved”和“success”事件的函数;第二个参数是处理“rejected”和“failure”事件的函数。调用这两个函数时将会把结果或者拒绝的原因作为参数传递进去。

只要返回的结果是合法的,接口就可以保证这两个函数中的一个会被调用。大多数deferred/Q实现都会遵守以上方式,但是AngularJS的实现比较特殊,原因如下: AngularJS知道$q的存在,所以$q会被整合到作用域模型中去。这样可以使解析时的传递速度更快,并且可以减少UI的闪烁和刷新。AngularJS的模板也认识$q,这样一来,接口的内容就可以被当作最终结果值(而不是当作promise)来对待,然后等获取结果之后再通知promise。体积更小,因为对于常用的异步任务来说,AngularJS只实现了它们所需要的最基本、最重要的功能。你可能会问为什么要做这样一件疯狂的事情呢?我们来看看使用异步函数时经常会遇到的一个问题:

在使用JavaScript时,人们经常会抱怨这种可怕的、金字塔一样的代码缩进噩梦。从本质上来说,异步返回的方式和程序的同步处理之间存在冲突,从而导致了多重嵌套的函数,这样就更难跟踪到当前的上下文了。另外,对错误的处理也存在同样的问题。处理错误的最佳方式是什么?你会在每一个步骤中都处理错误吗?那样会把代码搞得一团糟。为了解决这一问题,Promise方案提供了then的概念,在成功的情况下会执行一个函数,在出错的情况下执行另一个函数,两个函数都可以进行链式调用。所以,对于上面这个例子,如果使用Promise API(至少使用AngularJS的实现),可以这样展开:

整个金字塔式的代码就被很好地平坦化了,并且提供了链式的作用域,以及一个单一的出错处理点。你可以在应用中使用同样的代码来处理异步调用,只要导入AngularJS的$q服务即可。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180121A05SG200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券