【问题标题】:Getting asynchronous data from service从服务中获取异步数据
【发布时间】:2016-01-21 11:59:57
【问题描述】:

我尝试在服务中请求一些数据。我想确保将数据保存在服务的变量中,因为由于状态更改,我的控制器将一直重新加载,并且在站点加载时我只需要一次数据。

  app.service('resultDeals',['$translate','$cookies','$http',
    function($translate,$cookies,$http) {

      var currentOrigin = {};
      var originsUser={};

      return {

        loadOrigins:function() {
          $http.get('app/deals/deal.json').success(function(response){
            console.log(response);
            originsUser = response.data;
            return originsUser
          }).error(function(err){
            console.log(err);
          });
        },
        userOrigin:originsUser

      };

    }]);

我的控制器如下所示

console.log(resultDeals.loadOrigins());
    $scope.updateOrigins=resultDeals.loadOrigins();

问题是resultDeals.loadOrigins() 总是未定义。

我想确保将从 loadOrigins() 获得的数据存储在服务变量中,并且仅在需要时从控制器访问它,这样当控制器重新加载时就不必再获取数据了。

我该怎么做?

【问题讨论】:

    标签: angularjs asynchronous angular-promise angular-services angularjs-http


    【解决方案1】:

    不要使用.success & .error 回调函数,因为它们没有能力返回任何东西,因此它们不能继续承诺链。而是在$http.get 方法上使用.then(它返回一个promise 对象)。这将具有return data 的能力,而promise 是resolvedreject 一个promise。您可以从控制器方法继续 promise 链。

    服务

    return {
        loadOrigins: function() {
            return $http.get('app/deals/deal.json')
              .then(function(response) {
                console.log(response);
                originsUser = response.data;
                return originsUser
              }, function(err) {
                console.log(err);
              });
        },
        userOrigin: originsUser
    };
    

    控制器

    resultDeals.loadOrigins().then(function(user){
       $scope.updateOrigins= user;
    }, function(){
       console.log("Errror occurred.")
    })
    

    【讨论】:

    • 感谢您的回复。那不会返回 '$http.get(...).then(...).error is not a function' 吗?
    • @user3383709 很高兴为您提供帮助..谢谢:)
    【解决方案2】:

    在处理异步代码时,您必须处理 Promise。 loadOrigins 必须返回一个承诺并且你的控制器必须使用它。

    app.service('resultDeals',['$translate','$cookies','$http', '$q',
    function($translate,$cookies,$http,$q) {
    
      var currentOrigin = {};
      var originsUser={};
    
      return {
    
        loadOrigins:function() {
          var deferred = $q.defer();
    
          $http.get('app/deals/deal.json').success(function(response){
            console.log(response);
            originsUser = response.data;
            deferred.resolve(originUser),
          }).error(function(err){
            console.log(err);
            deferred.reject();
          });
    
          return deferred.promise;
        },
        userOrigin:originsUser
      };
    
    }]);
    
    // In controller
    resultDeals.loadOrigins().success(function(updateOrigins) {
        $scope.updateOrigins = updateOrigins;
    }).error(function() {
        console.log('bad !');
    });
    

    【讨论】:

    • 不需要创建$q.defer(); 因为$http.get 已经返回承诺
    • 如果他想返回response.data而不是response,你必须使用另一个promise。没有?
    • 不......你可以像我一样从.then函数返回......承诺链将继续
    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 2017-03-14
    • 2018-08-05
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2017-06-29
    • 2020-06-01
    相关资源
    最近更新 更多