从工厂返回控制器中的 $http promise 时未定义

Undefined when returning $http promise in controller from factory

无论我做什么,我总是接到 $$stateundefined 工厂的 API 电话。我已经尝试过 promises 并简单地从 .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 return 是一个承诺,

你可以做到

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
    });
    }

然后在控制器中,执行与现在相同的操作

其他方法只是 return 承诺 return 由 $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
     })

}]);