promise是一种用异步方式处理值(或者非值)的方法。promise是对象,12bet,代表了一个函数最终可能的返回值或者抛出的异常。
User.get(fromId)
.then(function(user) {
return user.friends.find(toId);
}, function(err) {
// 没找到用户
})
.then(function(friend) {
return user.sendMessage(friend, message);
}, function(err) {
// 用户的朋友返回了异常
})
.then(function(success) {
// user was sent the message
}, function(err) {
// 发生错误了
});
12bet,使用promise的目的是:获得功能组合和错误冒泡(error bubbling)能力的同时,12bet,保持代码异步运行的能力。同时,可以摆脱回调地狱
promise是头等对象,自带了一些约定:
可以把promise串起来,并且允许代码以通常运行的方式来处理。12博体育,从一个promise冒出的异常会贯穿整个promise链。
Angular的事件循环给予了Angular特有的能力,能在$rootScope.$evalAsync
阶段中执行promise。promise会坐等$digest运行循环结束。
12博体育,可以使用内置的$q服务创建promise。通过defer()
创建
var deferred = $q.defer();
创建的对象有如下三个方法:
deferred.reject("Can't update user");
// 等同于
deferred.resolve($q.reject("Can't update user"));
可以通过以下方法与promise交互:
then(successFn, errFn, notifyFn)
:总是返回一个新的promise,可以通过successFn或者errFn这样的返回值执行或者被拒绝。它也能通过notifyFn提供通知。catch(errFn)
:只是个帮助函数,能让我们用.catch(function(reason){})取代err回调finally(callback)
:允许我们观察promise的履行或者拒绝,而无需修改结果的值,不管promise是成功还是失败需要注意在IE中finally是关键字,所以需要通过
promise['finally'](function() {});
的方式调用$http的拦截器就是用promise实现的
then方法在初始promise被执行之后,返回一个新的派生promise。因此可以创建一个执行链,并在链中传递结果
GithubService.then(function(data) {
var events = [];
for (var i = 0; i < data.length; i++) {
events.push(data[i].events);
}
return events;//events被传递到下一个then
}).then(function(events) {
$scope.events = events;
});
同时$q库还进行了流程控制,提供了几个有用的方法
使用$q.all(promises)方法来把多个promise合并成一个
all()方法返回单个promise,会执行一个数组或者一个散列的值。每个值会响应promise散列中的相同序号或者键。如果任意一个promise被拒绝了,结果的promise也会被拒绝。
创建了一个deferred对象
创建了一个promise,被以某一原因拒绝执行了。它专门用于让我们能在一个promise链中转发拒绝的promise,类似于throw
把一个可能是值或者能接着then的promise包装成一个$q的promise
when()
函数返回了一个promise