Angular 1.5.4 $http progress event

前端 未结 5 1634
滥情空心
滥情空心 2020-12-05 21:04

Now Angular 1.5.4 finally allows you to track progress event on $http provider but for some reason I keep getting the $rootScope as a response instead of an actual progress

相关标签:
5条回答
  • 2020-12-05 21:14

    As seen in the docs here, the third parameter in a promise is a notify function.

    notify(value) - provides updates on the status of the promise's execution. This may be called multiple times before the promise is either resolved or rejected.

    It can be used like this:

    $http(requestData)
        .then(
            function success() {
                console.log('success');
            },
            function error() {
                console.log('error');
            },
            function notify() {
                console.log('notified');
            }
        );
    
    0 讨论(0)
  • 2020-12-05 21:24

    In AngularJS v1.5.7 works fine. If you have the chance I recommend upgrade!

    ...//formData = new FormData(); etc...
    var postParams = {
        method: 'POST',
        url: yourURLWS,
        transformRequest: angular.identity,
        uploadEventHandlers: {
            progress: function (e) {
                      if (e.lengthComputable) {
                         $scope.progressBar = (e.loaded / e.total) * 100;
                         $scope.progressCounter = $scope.progressBar;
                      }
            }
        },
        data: formData,
        headers: {'Content-Type': undefined }
    };
    
    var sendPost = $http(postParams); //etc...
    

    in HTML you have:

    <progress id="progress" max="100" value="{{progressBar}}"></progress>{{progressCounter}}%
    

    Result:

    progress result

    0 讨论(0)
  • 2020-12-05 21:25

    note - I have not worked with NG 1.5.4, the example below is for leveraging existing pre 1.5.4 APIs


    The notify(event) API is part of the deferred object when you call $q.defer(). I'm not sure what a practical implementation of this would be in terms of a typical get/put/post call via $http. But if you want to see it in action you can do something like this:

    some service API

    var mockRqst = function(){
        var d = $q.defer()
        var crnt = 0
    
        $off = $interval( function(){
            d.notify( crnt )
            crnt += 5
    
            if (crnt >= 100)
            {
                $interval.cancel( $off ) //cancel the interval callback
                d.resolve( "complete" )
            }
        }
    
        return d.promise
    }    
    

    using the notification

    someService.mockRqst()
    .then( thenCallback, catchCallback, function( update ){
         console.log("update", update)
    })  
    

    codepen - http://codepen.io/jusopi/pen/eZMjrK?editors=1010

    Again, I must stress that I'm not entirely sure how you can tie this into an actual external http call.

    0 讨论(0)
  • 2020-12-05 21:27

    The feature is broken for now: https://github.com/angular/angular.js/issues/14436

    0 讨论(0)
  • 2020-12-05 21:33

    Well I ended up doing something like this and just handle it myself as the XHR events added to $http dont work for me.

    var xhttp = new XMLHttpRequest();
    var promise = $q.defer();
    
    xhttp.upload.addEventListener("progress",function (e) {
        promise.notify(e);
    });
    xhttp.upload.addEventListener("load",function (e) {
        promise.resolve(e);
    });
    xhttp.upload.addEventListener("error",function (e) {
        promise.reject(e);
    });
    
    xhttp.open("post",API_URL + requestParams.url,true);
    
    xhttp.send(requestParams.data);
    
    return promise.promise;
    
    0 讨论(0)
提交回复
热议问题