Search code examples
angularjsfactorydeferred

Return deferred.promise 2 services back


I have 3 services.

  1. HttpSender - It controls the $http request

    app.service("HttpSender", ["$http", "$q", function ($http, $q) {
    
        this.send = function (path, method, params) {
            var deferred = $q.defer();
            $http({
                url: path,
                method: method,
                params: params
            }).then(function successCallback(response) {
                deferred.resolve(response.data);
            }, function errorCallback(response) {
                deferred.reject(response);
            });
            return deferred.promise;
        };
    
        this.sendRequestWithFile = function (path, method, params) {
            //todo check if needed
        };
    
    }]);
    
  2. Api - controls all the api/ access token processes

      service("API", ["HttpSender", "$q", 'WindowOpen', function(HttpSender, $q, WindowOpen){
    
    var self = this;
     var API = {};
    
        API.requestTypes = {
            GetMethod: "GET",
            PostMethod: "POST",
            DeleteMethod: "DELETE",
            PutMethod: "PUT"
        };
    
            API.sendRequest = function (path, method, parameters, isCheckAccessToken)
            {
                path = ServersConfig.getApiServerUrl() + path;
                parameters.access_token = getAccessToken();
                HttpSender.send(path, method, parameters);
            };
    
    
            return API;
    
        }]);
    
  3. Api - Endpoint which activate the api request

      app.factory('SelectedEndpoint', ['API', 
    
                   function (API) {
    
                    var getPath = function (campaign) {
                        return "/campaigns/" + campaign.id + '/content/selected';
                    };
    
                    return {
                        get: function (campaign) {
                            API.sendRequest(getPath(campaign),  API.requestTypes.GetMethod, {}, true).then(function (content) {
    
    
                            });
                        }
                    };
    
    
              }]);
    

How can return the deferred.promise to the endpoint function so the then will get the answer? The following process only works if i add then also in the api factory the then return it to the endpoint


Solution

  • How can return the deferred.promise to the endpoint function so the then will get the answer?

    By properly returning promises on each step.

    1. HttpSender service. Do not use deferred here, just return promise directly:

    app.service("HttpSender", ["$http", "$q", function($http, $q) {
    
      this.send = function(path, method, params) {
        return $http({
          url: path,
          method: method,
          params: params
        }).then(function successCallback(response) {
          return response.data;
        });
      };
    
    }]);
    

    2. Api service. Make sure you return previous promise with return HttpSender.send(path, method, parameters);:

     service("API", ["HttpSender", "$q", 'WindowOpen', function(HttpSender, $q, WindowOpen) {
    
      var self = this;
      var API = {};
    
      API.requestTypes = {
        GetMethod: "GET",
        PostMethod: "POST",
        DeleteMethod: "DELETE",
        PutMethod: "PUT"
      };
    
      API.sendRequest = function(path, method, parameters, isCheckAccessToken) {
        path = ServersConfig.getApiServerUrl() + path;
        parameters.access_token = getAccessToken();
        return HttpSender.send(path, method, parameters); // note return promise
      };
    
      return API;
    
    }]);