6

I'm struggling for the past day with some weird situation. What's happening is that for an http request to an API on a remote server occasionally duplicate requests are being sent. Can anyone please provide help on how to avoid these duplicated requests?

Here is an example of a function that I use on a factory:

factory.getAllConsultedClientsLogs = function(oParams) {

    var deferred = $q.defer();

    $http.post('url/to/api', oParams)
        .success(function(response) {
            deferred.resolve(response);
        })
        .error(function() {
            deferred.reject("Error! @factory.getAllConsultedClientsLogs");
        });

return deferred.promise;

};

...and an example of a function using the above indicated on a controller:

$scope.openConsultedClientsLogsModal = function(operator, date) {

    if (angular.isDefined(operator) && angular.isDefined(date)) {

        RrAuditingFactory.getAllConsultedClientsLogs({'operator':operator,'date':date}).then(function(promise) {

            if (angular.isObject(promise) && angular.isDefined(promise.error) && promise.error == 0) {

                var modalInstance = $modal.open({
                    templateUrl: 'path/partial',
                    controller: function($scope, $modalInstance, logsResult) {
                        $scope.logsResult = logsResult;
                    },
                    resolve: {
                        logsResult: function() {
                            return promise.result;
                        }
                    }
                });

                modalInstance.result.then(function() {
                }, function () {
                });

            } else {
                ErrorContext.setError(promise.errorMsg);
            }

        }, function(promise) {
            ErrorContext.setError(promise);
        });

    } else {

        ErrorContext.setError();

    }

};

Thank you in advance.. hope that anyone could help me out...

3 Answers 3

2

i have faced this problem, and you can resolve it like this :

check if you have declared ng-controller twice , you need to declare it just one time check if you have declared data-ng-click , if so , you need to replace it with ng-click that's it

Sign up to request clarification or add additional context in comments.

2 Comments

I had the same problem and I saw I used ng-controller AND $routeProvider.when('/route', { controller: 'MyController', ... });
The same for me: I specified controller name in $routeProvider and in HTML - that is why request doubled
1

I saw your link:

    $scope.fnRowCallback = function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {

        $('td:eq(4)', nRow).bind('click', function() {
            $scope.$apply(function() {
                $scope.openConsultedClientsLogsModal(aData.Operator, aData.LogDate);
            });
        });

        return nRow;
    };

You can unbind before doing the bind, this way you will prevent duplicates. Try like this:

    $scope.fnRowCallback = function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {



        //add this unbind to your code
        $('td:eq(4)', nRow).unbind("click");


        $('td:eq(4)', nRow).bind('click', function() {
            $scope.$apply(function() {
                $scope.openConsultedClientsLogsModal(aData.Operator, aData.LogDate);
            });
        });

        return nRow;
    };

I hope this helps.

3 Comments

Makes sense... I tested with the unbind and it fix my problem. Thank you for your cooperation.
@aqua,Am I missing something in the question? The code snippet in the answer isn't related to the one in question.
@jijil-kakkadathu I guess you are missing the date this question was posted. It has been almost 5 years now... and it's marked as resolved...
0

I tend to return an object from a factory, so in your case I'd do something like:

module.factory('clientsLogs', function($q, $http) {

  return {
    getAllConsulted: function(oParams) {
      var deferred = $q.defer();
      $http.post('url/to/api', oParams)
        .then(function(response) {
            deferred.resolve(response);
        }, function() {
            deferred.reject("Error! @factory.getAllConsultedClientsLogs");
        });

      return deferred.promise;
    }
  }

});

and then in your controller something like:

module.controller('MyCtrl', function($scope, clientsLogs) {
  clientLogs.getAllConsulted({}).then(function(){...})
}

Might not help you but I've never had any problems with duplicate calls doing it this way.

2 Comments

Thank you for your reply. But I'm doing it that way... The thing is that in some cases it duplicates calls. So, I would like to know if anyone could help me on how to prevent duplicated http requests? With a decorator or with a modified http service? Thanks.
I had the same problem and I saw I used ng-controller AND $routeProvider.when('/route', { controller: 'MyController', ... });

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.