2016-06-10 250 views
1

我有一個Angular項目,它有一個非常棒的Timeout烤麪包機,如果請求太慢,它會彈出。但問題是我需要更長的超時或超時重置在文件上傳過程中(使用ng-file-upload到s3存儲)。

我的問題是:我怎麼能在每一次進步響應復位$ HTTP超時或僅在文件上傳其更改爲某個數量龐大:

這裏是我的配置功能,我的攔截器代碼:

$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); 
      } 
     } 
    }) 

這裏是我的上傳功能:

$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"; 
             }); 
            }); 
           }; 

回答

1

$httptimeout option接受承諾:

timeout - {number | Promise} - 以毫秒爲單位的超時時間,或承諾應在解析時中止請求。

這意味着它可以是輪詢全局變量

config.timeout = $q(function (resolve) { 
    var i = 0; 
    var interval = setInterval(function() { 
    i++; 
    if (i * 1000 >= $rootScope.httpTimeout) { 
     resolve(); 
     $rootScope.$apply(); 
     clearInterval(interval); 
    }); 
    }, 1000); 
}); 

或實現適合的情況下的任何其他邏輯的承諾。

+0

感謝解決全局變量超時,似乎是工作 – johan