Javascript 从工厂返回控制器中的$http承诺时未定义
无论我做什么,我总是从我的工厂API调用中得到Javascript 从工厂返回控制器中的$http承诺时未定义,javascript,angularjs,state,Javascript,Angularjs,State,无论我做什么,我总是从我的工厂API调用中得到$$state或undefined。我尝试过承诺,只是从返回响应。数据。然后,但我尝试的都不起作用 我可以将正确的响应数据输入控制器,但当我尝试将其分配给任何对象时,我只会得到未定义的或$$state,具体取决于我使用的方法 我的工厂: factory('forecastFactory', function ($http, $q, SundialConfig) { var Forecast = {}; var weatherKey
$$state
或undefined
。我尝试过承诺,只是从返回响应。数据
。然后
,但我尝试的都不起作用
我可以将正确的响应数据输入控制器,但当我尝试将其分配给任何对象时,我只会得到未定义的
或$$state
,具体取决于我使用的方法
我的工厂:
factory('forecastFactory', function ($http, $q, SundialConfig) {
var Forecast = {};
var weatherKey = SundialConfig.openWeatherKey;
Forecast.dayCnt = 1;
Forecast.prepareCity = function (city) {
city === undefined ? city = 'Chicago, IL' : city = city;
return city;
}
Forecast.getForecast = function (city) {
var preparedCity = Forecast.prepareCity(city);
var deferred = $q.defer();
$http.jsonp('http://api.openweathermap.org/data/2.5/forecast/daily?', {
params: {
appid: weatherKey,
q: preparedCity,
cnt: Forecast.dayCnt,
callback: 'JSON_CALLBACK'
}
})
.then(function (res) {
console.log("success");
deferred.resolve(res);
})
.catch(function (err) {
console.log('error');
});
return deferred.promise;
}
return Forecast;
});
我的控制器:
controller('ForecastController', function ($scope, $location, forecastFactory, locationService) {
vm = this;
forecastFactory.getForecast('Chicago, IL').then(function (res) {
console.log(res);
vm.forecast = res;
});
});
我认为您不需要使用
$q
,因为$http返回一个承诺
你能行
Forecast.getForecast = function(city) {
var preparedCity = Forecast.prepareCity(city);
return $http.jsonp('http://api.openweathermap.org/data/2.5/forecast/daily?', {
params: {
appid: weatherKey,
q: preparedCity,
cnt: Forecast.dayCnt,
callback: 'JSON_CALLBACK'
}
})
.then(function(res) {
console.log("success");
return res.data;
})
.catch(function(err) {
console.log('error')
return []; // or {} depending upon required data
});
}
在控制器中,执行与现在相同的操作
另一种方法是简单地返回$http返回的承诺
Forecast.getForecast = function(city) {
var preparedCity = Forecast.prepareCity(city);
return $http.jsonp('http://api.openweathermap.org/data/2.5/forecast/daily?', {
params: {
appid: weatherKey,
q: preparedCity,
cnt: Forecast.dayCnt,
callback: 'JSON_CALLBACK'
}
})
}
在控制器中,您可以这样做
Sundial.Controllers.
controller('ForecastController', ['$scope', '$location', 'forecastFactory', 'locationService', function($scope, $location, forecastFactory, locationService) {
vm = this;
forecastFactory.getForecast('Chicago, IL').then(function(res) {
console.log(res)
vm.forecast = res.data;
}, function(err){
// do something
})
}]);
第一个返回Nothing第二个呢Close但是第一个
然后$http
的返回一个承诺对象,数据是该对象的属性哦,我忘了在$http.jsonp之前添加return
,在第一种情况下,这两个都不起作用。当在.then块中时,我仍然会得到该对象,但是vm.forecast在endtry中仍然显示为未定义,并更改为deferred.resolve(res.data)
。第一个res
是promise对象