2016-11-28 46 views
0

我的应用程序向我的节点/快递服务器发出GET请求。要检查我的服务器代码中的更改,我添加了setTimeout函数。我的客户端代码中的promise函数可以正常工作几分钟,但最终会停止工作,并且如果从服务器返回某些内容会花费太多时间会引发错误。有没有办法让promise函数继续运行,直到它从服务器获取数据而不是立即抛出错误?基本上,我希望超时继续在服务器上运行并检查更改,并且我希望getMessageData()承诺函数尽可能保持运行状态。角度承诺在等待响应太久后停止工作

这是在我的角度应用我的工厂代码,从我建的NodeJS /快速远程服务器获取数据:

app.factory('getMessageData', ['$q', '$http', function($q, $http) { 

    var last_updated_time = 0; 

    return function getData() { 
     var deferred = $q.defer(); 

     console.log("Time stamp is: "+last_updated_time); 
     var req = $http({ 
      url: 'https://20161128t161542-dot-jarvis-hd-live-2.appspot-preview.com/read-message', 
      method: 'GET', 
      cache: false, 
      params: {last_updated: last_updated_time} 
     }); 

     req.success(function(object) { 
      last_updated_time = object.time_stamp; 
      deferred.resolve(object); 
     }); 

     req.error(function(err) { 
      console.log("there was an error: "+err); 
      deferred.reject(err); 
     }); 

     return deferred.promise; 
    } 

}]); 

这是我的指令代码调用并启动工厂代码发出请求:

app.directive('message', ['getMessageData', function(getMessageData) { 
return { 
    restrict: 'E', 
    templateUrl: 'scripts/directives/message.html', 
    link: function (scope) { 

     function getMessage(){ 
      getMessageData().then(function(message_data){ 
       var message = message_data.data; 
       scope.message = message; 

       getMessage(); 

      }, function(err){ 
       console.log("Error: " + err); 
      }); 
     } 

     getMessage(); 

    } 
} 
}]); 

这是一个GET请求到/读取信息的URL我的服务器代码:

app.get('/read-message', function(req,res){ 

     var last_updated_time = req.query.last_updated; 

     function checkMessage() { 
      if(!last_updated_time || last_updated_time < new_time){ 
       updateMessage(); 
      } 
      else { 
       setTimeout(function(){ 
        checkMessage(); 
       }, 1000 * 10); //10 seconds 
      } 
     } 

     function updateMessage() { 
      var output = { 
       success: 1, 
       data: message, 
       time_stamp: new_time 
      }; 

      return res.json(output); 
     } 

     checkMessage(); 


    }); 
+0

了'promise'得到解决或者拒绝一次(不像一个事件侦听器),所以你需要继续看涨'getMessageData'并返回一个新的'promise'对象 - 这个职位可能是有益的,指向你在正确的方向http://stackoverflow.com/questions/15015416/how-to-set-a-global-http-timeout-in-angularjs –

+0

无论如何做长期投票呢? –

回答

-1

在你传递给$ http的对象中,你可以用你想要的值(以毫秒为单位)添加一个超时属性。 reffer这个$http

+0

你能给更多的清晰度吗?我是否将配置对象添加到我的需求? '变种REQ = $ HTTP({ \t \t \t URL: 'https://20161128t161542-dot-jarvis-hd-live-2.appspot-preview.com/read-message', \t \t \t方法:“ GET”, \t \t \t缓存:假的, \t \t \t PARAMS:{LAST_UPDATED:last_updated_time} \t \t});' –

+0

只是超时添加到您的对象的末尾。 var req = $ http({url:'https://20161128t161542-dot-jarvis-hd-live-2.appspot-previe w.com/read-message',方法:'GET',缓存:false,params :{last_updated:last_updated_time},timeout:1000}); – monssef

+0

这不起作用。当我添加这个超时时,我的应用程序在给我错误之前等待1秒钟。 –