在AngularJS中使用$q进行“同步”编程
2015年4月6日 · 73 字 · 1 分钟
今天群里有位朋友问到直接返回$http说读不到数据,原因在于$http是异步请求,而且是“不可期”的,你不知道什么时候这个请求完成了。
而对于这种需要“同步”编程的方式,AngularJS提供了一个内置Service $q,它提供了一种承诺/延后(promise/deferred),可以保证我们的调用代码一定能够拿到数据。所以我们用起来可以像同步调用一样,话说回来,最终还是xhr异步请求。
## Factory
app.factory('itemService', ['$http', '$q', function ($http, $q) {
return {
query : function() {
var deferred = $q.defer();//声明承诺
$http({method: 'GET', url: '/item/list'}).
success(function(data) {
deferred.resolve(data);//请求成功
}).
error(function(data) {
deferred.reject(data); //请求失败
});
return deferred.promise; // 返回承诺,这里返回的不是数据,而是API
}
};
}]);
Controller
angular.module('app')
.controller('MainCtrl', ['itemService','$scope', function (itemService,$scope) { // 注入itemService
var promise = itemService.query(); //获得承诺接口
promise.then(function(data) { // 成功回调
$scope.user = data;
}, function(data) { // 错误回调
console.log('请求失败');
});
}]);