首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态设置$http超时

动态设置$http超时
EN

Stack Overflow用户
提问于 2016-06-10 13:27:55
回答 1查看 924关注 0票数 1

我有一个角度的项目,有一个非常好的超时烤面包机,如果请求太慢弹出。但问题是,在文件上传期间,我需要更长的超时或超时重置(im使用ng文件上传到s3存储)。

我的问题是:如何在每次进度响应期间重置$http超时,或者仅在文件上传期间才将其更改为大量数字:

下面是我的配置函数中的拦截器代码:

代码语言:javascript
复制
$httpProvider.interceptors.push(function ($rootScope, $q, toaster) {
        return {
            request: function (config) {
                //config.cache = true;
                config.timeout = 6000;
                return config;
            },
            responseError: function (rejection) {
                //console.log(rejection);
                switch (rejection.status) {
                    case -1 :
                        console.log('connection timed out!');
                        toaster.pop({
                            type: 'error',
                            title: 'Server Timed Out!',
                            body: 'Waiting for request timed out! \n Please check your Internet connection and try again!',
                            timeout: 6000
                        });
                        break;
                    case 404 :
                        console.log('Error 404 - not found!');
                        toaster.pop({
                            type: 'error',
                            title: 'Server Timed Out!',
                            body: 'Error 404! \n Server returned: Not found! Please check your Internet connection and try again!',
                            timeout: 6000
                        });
                        break;
                }
                return $q.reject(rejection);
            }
        }
    })

这是我的上传功能:

代码语言:javascript
复制
$scope.upload = function (file) {

                                    $scope.count += 1;
                                    file.id= $scope.count;
                                    var durl = apiserv + "api.upload-s3.php?path=" + $scope.folder;
                                    var arr = [];
                                    arr.filename = file.name;
                                    arr.status = "";
                                    arr.progress = 0;
                                    arr.class = "list-group-item-warning";
                                    $scope.files[file.id] = arr;
                                    $http({url: durl}).then(function (drs) {
                                        console.log(drs);
                                        drs.data.file = file;
                                        Upload.upload({
                                            url: drs.data.action, //S3 upload url including bucket name
                                            method: 'POST',
                                            data: {
                                                key: drs.data.key,
                                                acl: drs.data.acl,
                                                Policy: drs.data.Policy,
                                                'X-Amz-Algorithm' : drs.data['X-Amz-Algorithm'],
                                                'X-Amz-Credential' : drs.data['X-Amz-Credential'],
                                                'X-Amz-Date' : drs.data['X-Amz-Date'],
                                                'X-Amz-Signature' : drs.data['X-Amz-Signature'],
                                                //'Content-Type': file.type !== '' ? file.type : 'application/octet-stream',
                                                file: file
                                            }
                                        }).then(function (resp) {
                                            console.log('Success ' + resp.config.data.file.name + 'uploaded. Response: ' + resp.data);
                                            $scope.files[resp.config.data.file.id].status = "Success";
                                            $scope.files[resp.config.data.file.id].progress = 100;
                                            $scope.files[resp.config.data.file.id].class = "list-group-item-success";
                                        }, function (resp) {
                                            console.log('Error status: ' + resp.status);
                                            $scope.files[resp.config.data.file.id].status = "Error: "+ resp.status;
                                            $scope.files[resp.config.data.file.id].progress = 0;
                                            $scope.files[resp.config.data.file.id].class = "list-group-item-danger";
                                        }, function (evt) {
                                            var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
                                            //console.log('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);
                                            console.log(evt.config.data.file);
                                            $scope.files[evt.config.data.file.id].status = "Uploading...";
                                            $scope.files[evt.config.data.file.id].progress = progressPercentage;
                                            $scope.files[resp.config.data.file.id].class = "list-group-item-warning";
                                        });
                                    });
                                };
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-10 14:40:04

$http option接受承诺:

超时值-{number}-超时(以毫秒为单位),或承诺在解析后应中止请求。

这意味着它可以成为轮询全局变量的承诺。

代码语言:javascript
复制
config.timeout = $q(function (resolve) {
  var i = 0;
  var interval = setInterval(function () {
    i++;
    if (i * 1000 >= $rootScope.httpTimeout) {
      resolve();
      $rootScope.$apply();
      clearInterval(interval);
    });
  }, 1000);
});

或实现符合情况的任何其他逻辑。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37749529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档