【发布时间】:2016-11-28 22:25:47
【问题描述】:
我的应用程序向我的节点/快递服务器发出 GET 请求。为了检查我的服务器代码的变化,我添加了一个 setTimeout 函数。我的客户端代码中的 Promise 函数可以正常工作几分钟,但如果从服务器获取返回的时间过长,最终会停止工作并抛出错误。有没有办法让 promise 函数保持运行,直到它从服务器取回数据而不是立即抛出错误?基本上,我希望超时在服务器中继续运行并检查更改,并且我希望getMessageData() promise 函数尽可能长时间地继续运行。
这是我在我的 Angular 应用程序中的工厂代码,它从我在 nodeJS/Express 中构建的远程服务器获取数据:
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();
}
}
}]);
这是我向 /read-message url 发出 GET 请求的服务器代码:
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();
});
【问题讨论】:
-
A
promise仅被解析或拒绝一次(与事件侦听器不同),因此您需要继续调用getMessageData并返回一个新的promise对象 - 这篇文章可能会有所帮助并且为您指明正确的方向stackoverflow.com/questions/15015416/… -
无论如何要为此做长轮询?
标签: javascript angularjs node.js express