【问题标题】:linking promises, or one promise triggers another链接承诺,或一个承诺触发另一个
【发布时间】:2013-11-25 04:02:30
【问题描述】:
我正在构建一个天气应用程序,我首先必须获取用户的位置,然后发出获取天气的请求。
所以我有一个GeolocationService 和一个WeatherService。我的WeatherService 目前正在调用Geolocation 服务。如何让WeatherService 等到它有来自GeolocationService 的结果后再发出HTTP 请求?
app.factory('GeolocationService',function($q,$window,$rootScope){
返回 {
getLatLon:函数(){
var deferred = $q.defer();
如果(!window.navigator){
$rootScope.$apply(function(){
deferred.reject(new Error("地理位置不可用"));
});
} 别的 {
$window.navigator.geolocation.getCurrentPosition(函数(位置){
$rootScope.$apply(function(){
deferred.resolve(位置);
});
},函数(错误){
$rootScope.$apply(function(){
deferred.reject(错误);
});
});
}
返回 deferred.promise;
}
};
});
app.factory("WeatherService", function ($q,$http,$rootScope, GeolocationService) {
返回 {
获取天气:函数(){
var 天气;
var loc = new GeolocationService.getLatLon();
var lat= loc.lat || 37.4568202221774,
lon= loc.lon || -122.201366838789;
变量单位 = '';
var url = 'http://api.openweathermap.org/data/2.5/forecast/daily?lat='+lat+'&lon='+lon+'&units='+units+'&callback=JSON_CALLBACK';
$http.jsonp(网址)
.成功(功能(数据){
天气=数据;
返回天气;
})
.错误(函数(错误){
天气=错误;
返回错误;
});
}
};
});
【问题讨论】:
-
真的不认为你需要在$apply 中包含resolve 和reject,不知道是什么想法
-
@charlietfl - 我试过不将解析包装在 $apply 中,但没有它就不会触发 .then。
标签:
javascript
angularjs
promise