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库了 }]);
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
.controller('HomeController', function($scope, GithubService) { GithubService.makeMultipleRequests([ 'auser/beehive', 'angular/angular.js']) .then(function(result) { // 处理结果 }, function(err) { // 发生错误了 }, function(percentComplete) { $scope.progress = percentComplete; }); });