如何传递嵌套服务并从角度工厂获取响应到控制器

时间:2016-05-27 12:11:10

标签: javascript angularjs angularjs-directive angularjs-scope angular-services

在这里,我已经发出了Http请求,并从第一个Service调用获得响应,并在第二个服务中传递第一个服务的响应,并获得响应和控制器。

我得到了回应,我怎么能进入控制器。

app.factory('logHomeService', function () {

        var getHomeService = function (LoginService, HomeService) {
            return
            {
                 LoginService.After("user", encodeURIComponent("pass"))
                  .then(function (response) {
                      debugger;
                      $stateParams.User = "admin";

                      var mydata = response.CT1SessionObj;


                      var DefaultModelObj = { cobj: mydata};

                      HomeService.pageLoad(DefaultModelObj)
                     .then(function (response) {
                         $rootScope.CT1SessionObj = response.mydata;



                     }, function (response) {
                         console.log("LoginService" + response.data);
                         alert(response.Message);
                     });

                  },

                      function (response) {
                          console.log("Home Service" + response.data);
                          return response.data;
                      });
                return response.data;
            };
        };
        return {
            getHomeService: getHomeService
        }

});

app.Controller('HomeController',function($scope,logHomeService)

{


this.logHomeService = logHomeService;
}

这里this.logHomeService = logHomeService在工厂返回方法,我如何从第二个服务获得响应结果

我需要将home service response返回到controller,console.log(“Home Service”+ response.data);

2 个答案:

答案 0 :(得分:1)

您需要使用promises,然后在控制器中侦听解决方案。

app.factory('logHomeService', function($q) {
  var getHomeService = function(LoginService, HomeService) {
    // create a promise object
    var deferred = $q.defer();

    LoginService.After("user", encodeURIComponent("pass")).then(
      function(response) {
        $stateParams.User = "admin";
        var mydata = response.CT1SessionObj;

        var DefaultModelObj = {
          cobj: mydata
        };

        HomeService.pageLoad(DefaultModelObj).then(
          function(response) {
            $rootScope.CT1SessionObj = response.mydata;
            // resolve the promise
            deferred.resolve( response );
          }, 

          function(response) {
            console.log("LoginService" + response.data);
            // reject the promise if there is an error
            deferred.reject( response );
            alert(response.Message);
          });
      },

      function(response) {
        console.log("Home Service" + response.data);
        // reject the promise if there is an error
        deferred.reject( response )
      });

    // return the promise
    return deferred.promise
  };
  return {
    getHomeService: getHomeService
  }
});

首先将$q注入工厂。然后从getHomeService()方法返回承诺。

承诺在3个地点解决,2次拒绝和1次解决。当呼叫失败时,拒绝可用于在控制器中执行某些操作。

接下来更新您的控制器以听取承诺。

app.Controller('HomeController', function($scope, logHomeService){
  this.logHomeService = logHomeService;

  this.logHomeService.getHomeService().then(
    function(successResponse){
      // success
    },
    function(failureResponse){
      // failure
    }
  )
}

答案 1 :(得分:0)

@Thanks授予你我的一天。在工厂使用了两个服务,在服务中我使用了承诺,但我没有在工厂使用。

var service1 = function ($http, $q, configAPI) {  
    var crContractApi_Url = configAPI.crContractApi_Url;
    this.pageLoad = function (params) {
        var result = $q.defer();
        params.obj.data = null;
        $http({
            method: 'POST',
            url: baseurl + '/reatiler/retailer',
            headers: { 'Content-Type': 'application/json' },
            data: JSON.stringify(params)
        })
       .success(function (response) {

           result.resolve(response);
       })
       .error(function (response) {

           result.reject(response);
       });

        return result.promise;
    }

就像在service2中使用的那样。是另一种方式