我的應用程序向我的節點/快遞服務器發出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 –
無論如何做長期投票呢? –