我的应用程序向我的节点/快递服务器发出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();
});
了'promise'得到解决或者拒绝一次(不像一个事件侦听器),所以你需要继续看涨'getMessageData'并返回一个新的'promise'对象 - 这个职位可能是有益的,指向你在正确的方向http://stackoverflow.com/questions/15015416/how-to-set-a-global-http-timeout-in-angularjs –
无论如何做长期投票呢? –