【问题标题】:Wait for a long execution response等待较长的执行响应
【发布时间】:2016-09-01 08:20:27
【问题描述】:

我向我的服务器 js 发布了一个 id,它执行的操作可能需要大约一分钟或更长时间。我认为在等待响应和再次 POST 时连接超时。我希望客户端或浏览器等到执行完成后再返回响应,这是长时间执行的结果。

我在网上看到了一些关于承诺的问题。我使用了承诺,但它仍然再次发布。还有其他解决方案吗?

代码:

      $scope.imageget = function(target) {
          $http.post('/' + 'region/images', {under: id})
                 .then(function(docs)  {
                $scope.results = docs.data.results;
                var responss = docs.data.results;
                var jsonresponse = JSON.parse(responss);
                jobdetails = jsonresponse;
                console.log(jobdetails)
          });

        };

承诺后的代码:

      $scope.imageget = function(target) {
          var deferred= $q.defer();
          $timeout(function(){

          $http.post('/' + 'region/images', {under: id})
                 .then(function(docs)  {
                $scope.results = docs.data.results;
                var responss = docs.data.results;
                var jsonresponse = JSON.parse(responss);
                jobdetails = jsonresponse;
                console.log(jobdetails)
          });
          deferred.resolve();    
              }, 3000);  
          return deferred.promise;

        };

【问题讨论】:

  • 使用promises并不能解决连接超时问题。
  • “它再次发帖”是什么意思?请不要只是想,而是确认使用开发者工具的网络面板连接超时。
  • 请求再次发送。当我在立即发送请求后做出响应时,它会继续正确执行,但我当然想要反馈给我的客户,这取决于正在执行的内容。
  • 您应该考虑以其他方式处理您的问题。您的服务器只能同时处理有限数量的连接。您的服务器应直接以“OK”响应,然后使用后台服务进行处理。下一步是从您的客户端进行一些拉取操作(每 x 秒检查一次状态),或者使用服务器中的 webSockets 通知客户端该作业已完成。
  • @DeblatonJean-Philippe 是的,我认为这是至少回馈进展的解决方案。

标签: javascript angularjs promise httpresponse


【解决方案1】:

尝试在 $http 配置参数中设置超时时间(这里我设置为三分钟)。

  $scope.imageget = function(target) {
      $http.post('/' + 'region/images', 
             {under: id}, 
             {timeout: 180000})
             .then(function(docs)  {
            $scope.results = docs.data.results;
            var responss = docs.data.results;
            var jsonresponse = JSON.parse(responss);
            jobdetails = jsonresponse;
            console.log(jobdetails)
      });

    };

有关 $http 配置的更多信息,请参阅the docsThis section 的配置使用特别有趣。

【讨论】:

    【解决方案2】:

    您的代码中有几个错误

    1. promise 之后的代码 等待 3000 毫秒,然后执行 post。
    2. promise 在 post 请求发送后立即返回,并且不会等到 post 返回。

    等待请求 60 秒应该不是问题。因此,我建议查看您的浏览器(最好是 Chrome ;-) )网络日志并检查它是否真的超时,或者您是否从服务器获得某种错误代码。

    【讨论】:

    • 其实我查了一下,发现它仍然挂起,并重新执行......这排除了超时。我找不到问题出在哪里,如果我在执行长任务之前响应,代码运行完美,我是否等待执行后响应它重新启动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2014-08-05
    相关资源
    最近更新 更多