Posted on 2015-02-27 18:39
云自无心水自闲 阅读(2604)
评论(1) 编辑 收藏 所属分类:
AngularJS
先给一个例子:
$http. get('/remote/item' ). then(function(response) {
console.log('成功。');
}, function(errResponse) {
console. error('出错.' );
});
一。介绍Promise
在这个例子中,$http.get()函数返回了一个Promise对象, 有了这个对象,我们才能很方便地直接在后面添加then函数的定义。
Promise对象在AngularJS中是一个非常重要的存在。它提供了强大的功能和便利性。
1。异步性
从定义的语法上看,操作似乎是同步的,但是Promise的工作其实是异步的,只有在服务端返回数据后,后续的函数才会被调用。这是一个事件驱动,非阻塞式的框架。
2。它避免了其它框架的嵌套回调函数的缺点。
-所有异步任务都会返回一个Promise对象
-每个Promise对象都有一个then函数,then函数有两个参数,分别是成功处理函数和失败处理函数
-失败处理函数和成功处理函数都只会在异步处理完成后被调用一次
-then函数也会返回Promise对象,这样,我们可以把多个函数串连起来成为一个函数链
-成功处理函数和失败处理函数的返回值可以被传递到函数链下一个的函数中
-如果在成功(或者失败)处理函数中,又开始了一个异步调用,那么函数链中的函数将会在这个异步调用结束后才开始
二。异步链式调用的后续处理
假如我们定义了如下的函数链:
$http.get('/item').then(s1, e1).then(s2, e2).then(s3, e3);
我们如何自主的根据函数链中每个函数的运行结果,决定触发后续函数的成功处理函数或者失败处理函数呢?
比如说,在s1处理过程中,发生问题,于是我们触发了e2, 但是在e2处理完后,我们又想触发s3.
AnguarJS提供了$q来满足这样的需求。
如果我们想触发函数链中下一个函数的成功处理,我们只需要最后给出一个返回值,有了返回值,AngularJS会认为函数执行正确,自动调用下一个函数中的成功处理
如果想触发失败处理,那么可以简单地返回$q.reject(data),这样就会触发下一个函数的失败处理