来自AngularJS的$ success回调函数

我正在调用控制器来获取API值。 如何在$ http方法之外传递数组?

我需要将一个数组pa[]传递给$scope.myData = pa;

首先,console.log(pa)打印值[10,20,30,40]。

其次,console.log(pa)清空数组[]。

JavaScript的

 function Ctrl($scope, $http) { var url = "https://spreadsheets.google.com/feeds/list/0AsXjbsnPIu06dGswZUV4WX/values?alt=json-in-script&callback=angular.callbacks._0"; var pa = []; $http({ method: 'JSONP', url: url }).success(function (data) { for (i = 0; i < data.feed.entry.length; i++) { var entry = data.feed.entry[i]; pa.push(entry.gsx$productivity.$t); console.log(pa); //[10,20,30,40,50] } }); console.log(pa) // [] empty array $scope.myData = pa; } 

如何在$ success回调函数之外获取数组?

此代码是异步的。 在$http服务有机会从API调用中获取值之前, pa被分配给$scope.myData

您需要使用$q服务承诺库来控制代码流。 像这样的东西:

 function Ctrl($scope, $http, $q) { var url = "https://spreadsheets.google.com/feeds/list/0AsXjbsnPIu06dGswZUV4WX/values?alt=json-in-script&callback=angular.callbacks._0"; var pa = []; var paPromise = $q.defer() $http({ method: 'JSONP', url: url }).success(function(data) { for (i = 0; i < data.feed.entry.length; i++) { var entry = data.feed.entry[i]; pa.push(entry.gsx$productivity.$t); console.log(pa); //[10,20,30,40,50] } paPromise.resolve(pa) }); $scope.myData = paPromise.promise; } 

在这里,我们注入$q服务并使用它实例化变量paPromise 。 接下来,我们将此承诺提供给$scope.myData 。 一旦在$http成功方法中解析了promise,AngularJS将通知您的$scope并更新该值,它将反映在您的模板/ DOM上。

这真的没有多大意义。 它应该是这样的:

 $scope.myData = []; $http({ method: 'JSONP', url: url }).success(function (data) { for (i = 0; i < data.feed.entry.length; i++) { var entry = data.feed.entry[i]; $scope.myData.push(entry.gsx$productivity.$t); console.log(pa); //[10,20,30,40,50] } }); 

由于pa设置在控制器函数内部,因此它不会为您声明任何内容,然后将$scope.myData设置$scope.myData等于pa 。 那只是在惹麻烦。

如果您更喜欢jQuery Ajax,请使用extend函数将成功数据返回到外部,

 $(function(){ $.extend({ returnData: function(url) { var result = null; var pa = []; $.ajax({ url: url, type: 'get', dataType: 'jsonp', async: false, success: function(data) { for (i = 0; i < data.feed.entry.length; i++) { var entry = data.feed.entry[i]; pa.push(entry.gsx$productivity.$t); } result = pa; } }); return result; } }); }); finaldata = $.returnData('https://spreadsheets.google.com/feeds/list/0AsXjbsnPIu06dGswZUV4WX/values?alt=json-in-script&callback=angular.callbacks._0'); console.log(finaldata);