返回由promise AngularJS返回的操作变量

时间:2018-04-14 11:54:09

标签: javascript angularjs promise angularjs-scope angular-promise

所以,我被困在这里很可能是因为我对promise object的理解有限。

我从工厂获取数据的函数是

    $scope.getLogoFromService = function() {
    console.log('getLogoFromService called');
    var promise = 
        logoService.getLogo();
    promise.then(
       function(payload) { 
           console.log(payload.data.home_header.logo.file_path);
           $scope.logoPath = payload.data.home_header.logo.file_path;
       },
       function(errorPayload) {
           $log.error('failure loading logo', errorPayload);
       });
  };

如果我{{logoPath}},我在视图中可以访问变量,当我在函数内部访问console.log但在其他函数中无法访问时。

   $scope.UpdateLogo = function ()
        {
            console.log('UpdateLogo called');
            console.log($scope.logoPath);
        }

返回undefined。

我的服务代码,以防您需要查看

App.factory('logoService', function($http) {
    return {
      getLogo: function() {
         return $http.get('cms/general');
      }
    }
  }); 

1 个答案:

答案 0 :(得分:1)

看起来您在http呼叫返回之前正在呼叫UpdateLogo,我建议您这样处理:

$scope.getLogoFromService = function() {
  console.log('getLogoFromService called');
  var promise = logoService.getLogo();

  promise.then(
    function(payload) { 
      console.log(payload.data.home_header.logo.file_path);
      $scope.logoPath = payload.data.home_header.logo.file_path; // For use in the view.
      return $scope.logoPath; // Return the logopath to the next function in the chain.
    },
    function(errorPayload) {
      $log.error('failure loading logo', errorPayload);
    }
  );

  return promise;
};

$scope.UpdateLogo = function() {
  console.log('UpdateLogo called');
  $scope.getLogoFromService().then(function(logoPath) {
    console.log('getLogoFromService resolved!');
    console.log(logoPath);
  });
}

由于logoPath被分配到范围,因此您在技术上不必担心将其传递到承诺链,但这是最佳做法,所以我先建议它,或者这将是也工作:

$scope.getLogoFromService = function() {
  console.log('getLogoFromService called');
  var promise = logoService.getLogo();

  promise.then(
    function(payload) { 
      console.log(payload.data.home_header.logo.file_path);
      $scope.logoPath = payload.data.home_header.logo.file_path; // For use in the view.
    },
    function(errorPayload) {
      $log.error('failure loading logo', errorPayload);
    }
  );

  return promise;
};

$scope.UpdateLogo = function() {
  console.log('UpdateLogo called');
  $scope.getLogoFromService().then(function() {
    console.log('getLogoFromService resolved!');
    console.log($scope.logoPath);
  });
}

在这种情况下,我们只是使用承诺作为"数据现在可用"通知,但我们实际上并未传递数据,因为它已分配给$scope,并且两个功能都可以访问该数据。

整个事情也可以压缩成一个更简单的功能,但我保持原始结构的完整。