user3517454
user3517454

Reputation: 217

Resolving/rejecting promises within $http get not working.

I am trying to reject a deferred object within a $http.get call but it is not being properly rejected. The errorcallback is not being called, and I just can't figure out why. Here is basically what I have:

var promise = this.SomeAsyncCall(this.$.SomeID)
                .then(
                    function () 
                    {
                        service.SendAsyncDownloadReqeuest(someOtherID);
                    },
                this.ErrorHandler.HandleError)
                  .then(this._DownloadInitiated, this.ErrorHandler.HandleError);
              promise["finally"](this._DownloadRequestFinished);

And here is the service.SendAsyncDownloadRequest:

var SendAsyncDownloadReqeuest = function (ID)
{
    var url = "someUrl?ID=" + customerID;
    var navigator = self.$window.navigator;
    var window = self.$window;
    var deferred = self.$q.defer();
    self.$http.get(url, { responseType: 'arraybuffer' })
    .success( function(data, status, headers) {
        var success = false;
        //Initiate download via blob. Set success

        success ? deferred.resolve() : deferred.reject();
    })
    .error(function (data, status)
    {
        var error = 
        { 
           //Some error properties 
        }
        deferred.reject(error);
    });

    return deferred.promise;
};

When I test this by returning a 500 status code from the server, it reaches the .error block of the http get call and completes the reject line, but the ErrorHandler's HandleError method is not reached. The HandleError method is correct since it works with errorcallbacks for promises rejected in anything that's not $http.get.

Upvotes: 1

Views: 134

Answers (2)

Kent Cooper
Kent Cooper

Reputation: 4509

You're never passing the promise from service.SendAsyncDownloadReqeuest(someOtherID); back to your HandleError function. You need to change your code to this:

var promise = this.SomeAsyncCall(this.$.SomeID)
                .then(
                    function () 
                    {
                        return service.SendAsyncDownloadReqeuest(someOtherID);
                    },
                this.ErrorHandler.HandleError)
                  .then(this._DownloadInitiated, this.ErrorHandler.HandleError);
              promise["finally"](this._DownloadRequestFinished);

If you want to be a little clearer you could change it to this:

var promise = this.SomeAsyncCall(this.$.SomeID)
                  .then(function () {
                         service.SendAsyncDownloadReqeuest(someOtherID).then(
                           this._DownloadInitiated,
                           this.ErrorHandler.HandleError);
                  },
                  this.ErrorHandler.HandleError);
promise["finally"](this._DownloadRequestFinished);

Upvotes: 1

Satej S
Satej S

Reputation: 2156

Don't use the success method either way.Both methods have been deprecated.

The $http legacy promise methods success and error have been deprecated. Use the standard then method instead. If $httpProvider.useLegacyPromiseExtensions is set to false then these methods will throw $http/legacy error.

Here is the shortcut method

$http.post('/someUrl', data, config).then(successCallback, errorCallback);

Here is a longer GET method sample

$http({
  method: 'GET',
  url: '/someUrl'
}).then(function successCallback(response) {
    // this callback will be called asynchronously
    // when the response is available
  }, function errorCallback(response) {
    // called asynchronously if an error occurs
    // or server returns response with an error status.
  });

Official Documentation

Upvotes: 0

Related Questions