AngularJS promise

promise是一种用异步方式处理值(或者非值)的方法。promise是对象,代表了一个函数最终可能的返回值或者抛出的异常。在与远程对象打交道时,promise会非常有用,可以把它们看作远程对象的一个代理。

习惯上,JavaScript使用闭包或者回调来响应非同步的有意义的数据,比如页面加载之后的XHR请求。我们可以跟数据进行交互,就好像它已经返回了一样,而不需要依赖于回调函数的触发。回调已经被使用了很长时间,但开发人员用它时都会很痛苦。回调使得调用不一致,得不到保证,当依赖于其他回调时,它们篡改代码的流程,通常会让调试变得非常难。每一步调用之后,都需要显式处理错误。在执行异步方法时触发一个函数,然后期待一个回调能运行起来。与之不同的是,promise提供了另外一种抽象:这些函数返回promise对象。

 

// 示例回调代码
User.get(fromId, {
success: function(err, user) {
if (err) return {error: err};
user.friends.find(toId, function(err, friend) {
if (err) return {error: err};
user.sendMessage(friend, message, callback);
});
},
failure: function(err) {
return {error: err}
}
});

 

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) {
// 发生错误了
});

 

代码不仅仅是可读性变高了,也更容易理解了。我们可以保证回调是一个值,而不用处理回调接口。

想要在Angular中创建promise,可以使用内置的$q服务。$q服务在它的deferred API中提供了一些方法。首先,需要把$q服务注入到想要使用它的对象中。

 

angular.module('myApp', [])
.factory('GithubService', ['$q', function($q) {
// 现在就可以访问到$q库了
}]);

 

.controller('HomeController',
function($scope, GithubService) {
GithubService.makeMultipleRequests([
'auser/beehive', 'angular/angular.js'])
.then(function(result) {
// 处理结果
}, function(err) {
// 发生错误了
}, function(percentComplete) {
$scope.progress = percentComplete;
});
});
View Code

 

 

 

 

 

 

 

 

 

posted @ 2015-10-14 11:05  Byron12345  阅读(224)  评论(0编辑  收藏  举报