我在controller.js中有以下代码,
var myApp = angular.module('myApp',[]); myApp.service('dataService', function($http) { delete $http.defaults.headers.common['X-Requested-With']; this.getData = function() { $http({ method: 'GET', url: 'https://www.example.com/api/v1/page', params: 'limit=10, sort_by=created:desc', headers: {'Authorization': 'Token token=xxxxYYYYZzzz'} }).success(function(data){ return data }).error(function(){ alert("error"); }); } }); myApp.controller('AngularJSCtrl', function($scope, dataService) { $scope.data = dataService.getData(); });
但是,我想我可能在CORS相关问题上犯了一个错误。您能给我指出拨打电话的正确方法吗?非常感谢!
首先,您的success()处理程序仅返回数据,但getData()由于已在回调中,因此不会返回给调用方。 $http是一个返回的异步调用$promise,因此您必须为数据可用时注册一个回调。
success()
getData()
$http
$promise
我建议在AngularJS中查找Promises和$ q库,因为它们是在服务之间传递异步调用的最佳方法。
为简单起见,这是您的相同代码,但使用调用控制器提供的函数回调函数进行了重写:
var myApp = angular.module('myApp',[]); myApp.service('dataService', function($http) { delete $http.defaults.headers.common['X-Requested-With']; this.getData = function(callbackFunc) { $http({ method: 'GET', url: 'https://www.example.com/api/v1/page', params: 'limit=10, sort_by=created:desc', headers: {'Authorization': 'Token token=xxxxYYYYZzzz'} }).success(function(data){ // With the data succesfully returned, call our callback callbackFunc(data); }).error(function(){ alert("error"); }); } }); myApp.controller('AngularJSCtrl', function($scope, dataService) { $scope.data = null; dataService.getData(function(dataResponse) { $scope.data = dataResponse; }); });
现在,$http实际上已经返回了一个$ promise,因此可以将其重写:
var myApp = angular.module('myApp',[]); myApp.service('dataService', function($http) { delete $http.defaults.headers.common['X-Requested-With']; this.getData = function() { // $http() returns a $promise that we can add handlers with .then() return $http({ method: 'GET', url: 'https://www.example.com/api/v1/page', params: 'limit=10, sort_by=created:desc', headers: {'Authorization': 'Token token=xxxxYYYYZzzz'} }); } }); myApp.controller('AngularJSCtrl', function($scope, dataService) { $scope.data = null; dataService.getData().then(function(dataResponse) { $scope.data = dataResponse; }); });
最后,还有更好的方法来配置$http服务以处理用于config()设置的标头$httpProvider。请查看$ http文档以获取示例。
config()
$httpProvider