Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从工厂返回控制器中的$http承诺时未定义_Javascript_Angularjs_State - Fatal编程技术网

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

Javascript 从工厂返回控制器中的$http承诺时未定义,javascript,angularjs,state,Javascript,Angularjs,State,无论我做什么,我总是从我的工厂API调用中得到$$state或undefined。我尝试过承诺,只是从返回响应。数据。然后,但我尝试的都不起作用 我可以将正确的响应数据输入控制器,但当我尝试将其分配给任何对象时,我只会得到未定义的或$$state,具体取决于我使用的方法 我的工厂: factory('forecastFactory', function ($http, $q, SundialConfig) { var Forecast = {}; var weatherKey

无论我做什么,我总是从我的工厂API调用中得到
$$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对象