承诺,因此这段代码是善良的 的 </跨度> 混合物 的 </跨度> 事 </跨度> 我已经看透了 互联网 </跨度> :d
我已经完成了所有工作,但我错过了最后一步:将处理后的结果数组(“allSpots”)返回到…; }); } }; return wifiSpotFactory; })
然后在控制器中,如何检索值 的 </跨度> 承诺?
.controller(‘wifiListController’,[ ‘$ scope’,‘wifiSpotFactory’,功能……
返回链接的承诺:
function onGeolocationSuccess(position) { var url = 'http://localhost:34915/api/spots?latitude=' + position.coords.longitude + '&longitude=' + position.coords.latitude; return $http.get(url).success(function(data, status, headers, config) { var allSpots = []; for (var i = 0; i < data.length; i++) { var newSpot = new WifinderModel.wifiSpot(data[i].id, data[i].name, data[i].password, data[i].address); allSpots.push(newSpot); } return allSpots; }).error(function(data, status, headers, config) {}); };
那么电话可以是:
deferred.promise .then(onGeolocationSuccess) .then(function(allSpots) { ... });
Callback 没有能力返回数据,你应该真正使用promise模式,它有能力从promise返回数据。您 onGeolocationSuccess 似乎正在使用回调模式 return data 但事实上并非如此。
Callback
onGeolocationSuccess
return data
你可以通过从中返回承诺来解决问题 onGeolocationSuccess 方法,你需要返回 $http.get 已经返回promise对象的对象。在 .then 你会得到的那种功能 data 已从API返回。从.then函数你可以返回一个 data 这将有助于你遵循 的 承诺模式 强> 。
$http.get
.then
data
的 码 强>
.factory('wifiSpotFactory', function(WifinderModel, $q, $http) { function onGeolocationSuccess(position) { var url = 'http://localhost:34915/api/spots?latitude=' + position.coords.longitude + '&longitude=' + position.coords.latitude; return $http.get(url). then(function(response) { var allSpots = [], data = response.data; for (var i = 0; i < data.length; i++) { var newSpot = new WifinderModel.wifiSpot(data[i].id, data[i].name, data[i].password, data[i].address); allSpots.push(newSpot); } return allSpots; }, function(error) { console.log(error) }); }; var wifiSpotFactory = { loadNearSpots: function() { //..other code as is..to make solution cleaner removed that part. //return promise to follow promise chain return deferred.promise .then(onGeolocationSuccess) .then(function(allSpots) { return allSpots; }); } }; return wifiSpotFactory; })
的 调节器 强>
.controller('wifiListController', ['$scope', 'wifiSpotFactory', function ($scope, wifiSpotFactory) { wifiSpotFactory.loadNearSpots().then(function(data){ $scope.spots = data; //data will be available inside `.then` which promise resolve/reject }); } ])