从工厂返回控制器$http承诺时未定义
Undefined when returning $http promise in controller from factory
无论我做什么,我总是从工厂API调用中得到$$state
或undefined
。我尝试过承诺,只是简单地从.then
那里返回response.data
,但我尝试过的都没有奏效。
我可以将正确的响应数据放入我的控制器中,但是当我尝试将其分配给任何内容时,我只会得到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
})
}]);
相关文章:
- JavaScript承诺-无法读取属性'那么'的未定义
- 承诺返回未定义的服务
- 问.js节点承诺.“套接字”上缺少错误处理程序.类型错误:无法调用未定义的方法“then”
- 返回承诺与返回承诺内未定义之间的区别
- 从工厂返回控制器$http承诺时未定义
- JS未定义的承诺
- jQuery承诺不适用于未定义的方法html
- 为什么在从此承诺返回数据时我未定义
- 返回承诺,但得到'无法读取属性'那么'的未定义'
- Bluebird承诺:any()集合返回值未定义
- Shopify Buy JS SDK在IE 11上抛出错误—承诺未定义
- 拒绝未定义的承诺
- 无法读取property 'then'JavaScript的未定义承诺
- 测试承诺导致未定义的值
- 嵌套承诺返回未定义
- Nodejs运行承诺,但仍然未定义不是一个函数
- javascript承诺<值>未定义
- 承诺实现处理程序未定义
- 安贝回复.承诺解析函数返回未定义
- JavaScript ES6对Angular2的承诺——未定义的变量