我正在尝试使用Angular JS构建一个简单的天气应用程序。
我创造了一个 - 1)Html页面 2)3个Angular Js组件 -
angular
.module('weather')
.controller('weatherctrl', function($scope, factory,getGeoLoc){
$scope.ip;
$scope.geoloc;
//city obtainer-
factory.getIP().success(function(data){
$scope.ip = data;
}).error(function(error){
console.log("error");
});
//use the ip obtained on the lo/la api.
getGeoLoc.getGeo().success(function(data){
$scope.geoloc = data
}).error(function(error){
console.log("error");
})
});
//This is the factory for data recieving.
angular
.module('weather')
.factory('factory',function($http){function getIP(){
return $http({
method:'GET',
url:'http://ip-api.com/json/'
})
} return {getIP:getIP} });
我要将IP从工厂1传递到工厂2以使用经度和纬度
angular
.module('weather')
.factory('getGeoLoc',function($http){
function getGeo(data){
return $http({
method:'GET',
url:'http://api.openweathermap.org/data/2.5/weather?lat='+data.lat+'&lon='+data.lon+'&units=metric&APPID=0bd5e484b08e1c327c6bb917a530ad63',
})
}
return{
getGeo:getGeo
}
});
我试过传递/返回
getGeo(getIP)
作为工厂2中getGeo的函数参数。但它不起作用。
请帮助我,我是Angular JS的初学者。
此外,控制器和两个工厂都写在不同的 js 文件中。 controller.js factory1.js factory2.js
答案 0 :(得分:1)
两个函数factory.getIp
和getGeoLoc.getGeo
都会返回承诺。 链承诺,返回值或承诺到下一个。
factory.getIp()
.then(function getIpSuccess(response){
$scope.ip = response.data;
//return next promise to chain
return getGeoLoc.getGeo($scope.ip);
}).then(function getGeoSuccess(response) {
$scope.geoloc = response.data;
//return data for chaining
return $scope.geoloc;
}).catch(function onReject(error){
console.log("error ", error.status);
//throw to chain error
throw error;
});
在上面的示例中,如果getIp
操作失败,将跳过getGeo
操作。 catch处理程序将从第一个或第二个.then
处理程序中获取错误。
避免使用.success
和.error
,因为会忽略返回(或抛出)值。
而是使用.then
和.catch
。