【问题标题】:Angular 1.5.4 $http progress eventAngular 1.5.4 $http 进度事件
【发布时间】:2016-04-14 12:15:21
【问题描述】:

现在 Angular 1.5.4 终于允许您跟踪 $http 提供程序上的进度事件,但由于某种原因,我一直将 $rootScope 作为响应而不是实际进度(我将其用于上传)信息。由于缺乏示例,我在 Angular 存储库中找到了一些测试并遵循了这些测试,但没有成功。

restClientInstance.post = function (requestParams) {
    var postParams = {
        method: "POST",
        url: API_URL + requestParams.url,
        headers: requestParams.headers,
        data: requestParams.data,
        eventHandlers: {
            progress: function (c) {
                console.log(c);
            }
        },
        uploadEventHandlers: {
            progress: function (e) {
                console.log(e);
            }
        }
    };

    var promise = $http(postParams)
    $rootScope.$apply();
    return promise;
};

在这两种情况下,它都控制 $rootScope 而不是 lengthComputable

【问题讨论】:

标签: javascript angularjs http progress


【解决方案1】:

在 AngularJS v1.5.7 中工作正常。如果有机会我推荐升级!

...//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...

在 HTML 中你有:

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

结果:

progress result

【讨论】:

  • 另一种方式是$http.post(yourURLWS, formData, postParams)(没有冗余)
  • 尽管文件加载未完成,但我在发送请求后立即有 100%。
【解决方案2】:

【讨论】:

    【解决方案3】:

    好吧,我最终做了这样的事情并自己处理它,因为添加到 $http 的 XHR 事件对我不起作用。

    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;
    

    【讨论】:

    • 进度按应有的方式更新,一切正常我认为目前 1.5.4 只是错误。
    • 很遗憾这在 $http API 中没有正确连接。
    • 好奇,你去1.5.4的github页面上报问题了吗?
    • @jusopi 也许是这样,我只是做错了什么?
    • @jusopi 是的,我在他们的页面上报告了它。
    【解决方案4】:

    注意 - 我没有使用过 NG 1.5.4,下面的例子是为了利用现有的 pre 1.5.4 APIs


    当您调用$q.defer() 时,notify(event) API 是 deferred 对象的一部分。对于通过$http 进行的典型get/put/post 调用,我不确定具体的实现方式是什么。但如果你想看到它的实际效果,你可以这样做:

    一些服务 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
    }    
    

    使用通知

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

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

    再次,我必须强调,我不完全确定如何将其与实际的外部 http 调用联系起来。

    【讨论】:

    • 查看 Angular 1.5.4(大约一天前已经发布)最终将事件侦听器添加到 $http 调用中,您可以绑定到底层 XHR 以便您可以收听 xhr.progress 和xhr.upload.progress 但这是我的问题,当我使用普通 JS 创建自己的上传请求时,onprogress 很好地返回了有关文件的所有信息,但 Angular 1.5.4 中的实现返回给我 $rootScope 它应该在哪里发生事件。
    【解决方案5】:

    如文档here 中所见,promise 中的第三个参数是notify 函数。

    notify(value) - 提供有关承诺执行状态的更新。在解决或拒绝承诺之前,这可能会被多次调用。

    可以这样使用:

    $http(requestData)
        .then(
            function success() {
                console.log('success');
            },
            function error() {
                console.log('error');
            },
            function notify() {
                console.log('notified');
            }
        );
    

    【讨论】:

    • 我很确定 notify 实际上永远不会触发。
    • 奇怪,我已经通知在我自己的应用程序中工作,你能放一些代码吗?
    • 对于 $http?还是您自己的 XHR 承诺包装器?
    • @DupliaApp $http,甚至在 $q 文档中
    • 哦,我也没有提到它的文件上传进度,而不仅仅是请求进度。
    猜你喜欢
    • 2020-06-21
    • 2022-01-17
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多