无法从 $http promise 和 then() 代码中获取值未执行

Can't get a value from $http promise and then() code not executed

我过去已经遇到过 $http 服务的问题,我通过创建一个服务来处理我的请求来解决这个问题(对于那些感兴趣的人,这里是 link 的答案,这对我有帮助我,编辑部分:).

现在的问题是这个解决方案似乎无法有效处理更大的 $http 请求。在上一个中,我只将请求返回的单词分配给了 $scope 值。现在,返回的是 JSON 格式的整个配置(我也想存储在 $scope 中)。

我理解承诺的概念,事实上 $http 返回的值在响应到来之前是一个空字符串,这可能需要一些时间。但是在这里,配置并没有那么长,而且我似乎从来没有得到答案;我在视图上显示接收值的变量,并且在调用函数时它不会改变。

代码如下:

查看

...
<div>
    {{loadedConfig}} 
</div>
<button ng-click="loadconfig()">load</button>

控制器

app.controller('ConfigurationCtrl', function ($scope, $rootScope, configloader) {
    ...
    $scope.loadedConfig = 'noconfig'
    $scope.loadconfig = function() {
        configloader.load().then(function (response) {
            $scope.loadedConfig = response.data;
        });
    };

工厂

angular
    .module('app')
    .factory('configloader', configloaderFactory);

function configloaderFactory($http) {

   var service = {
      load: load
   }

   return service;

   function load() {
      return $http.get('url/config');
   }
}

如果我调用 'lesser weighted request',这没有问题。我还尝试了其他方法来进行此调用,但在每种情况下都不起作用...(使用 $q.deferred、使用 success()/error() 或使用自定义 sleep() 函数)

then 中的代码是否应该在我收到响应时执行? (我假设是,但从来没有)。

谢谢

尝试:

angular
    .module('app')
    .factory('configloader', configloaderFactory);

function configloaderFactory($http) {

   var service = {
      load: load
   }

   return service;

   function load() {
      return $http.get('url/config')
      .then(requestSuccessful)
      .catch(requestFailed)
   }

   function requestSuccessful(response) {
        return response.data;
    }

   function requestFailed(error) {
        console.log('Fail', error.data)
    }

}

由于这与长(更大)请求有关,请考虑更改您的代码并使用超时:

return $http({
    method: 'GET',
    url: 'url/config',
    timeout: 1 * 60 * 1000    // timeout of 1 minute
});

试试 return 你工厂里的 promise,比如 :

function load() {
     var promise =   $http.get('url/config').then(function(response){
     return response.data;     
     }, function(err){
       //error     
       return err;
     });
     return promise;
   }