我正在设计REST API来执行一些需要大量计算的任务,以供其他服务使用。实质上,对/command
的GET请求将开始执行任务,状态将在/queue/12345
更新。客户端轮询/queue/12345/
直到任务完成,此时服务器发送303,其中包含结果的位置(/runs/12345
)。
我现在要做的就是在客户端编写轮询功能。我现在可以成功轮询 - 但是,因为在发送请求后立即调用setTimeout()
函数。这意味着即使我没有在请求的回调函数中调用setTimeout()
,我也将永远进行轮询。
如果我收到303状态代码,如何确保我的轮询功能结束?
// standard first call is pollQueue(uri, 0);
function pollQueue(uri, timesPolled, callback) {
if(timesPolled > 28800) {
// 288800 is (60 sec/min * 60 min/hr * 24 hr) / 3 sec/poll. Aka 24 hours.
throw 'ResourceWillNeverBeReady';
}
console.log("polling " + uri);
request({
url: "http://localhost:2500/" + uri,
followRedirect: false
}, function (error, response, body) {
if(response.statusCode === 303) {
// callback handles requesting the actual data
callback(response.headers.location);
return;
}
});
setTimeout(function() { pollQueue(uri, timesPolled + 1, callback);}, 3000);
}
答案 0 :(得分:1)
setTimeout()
函数移动到回调中。
// standard first call is pollQueue(uri, 0);
function pollQueue(uri, timesPolled, callback) {
if(timesPolled > 28800) {
// 288800 is (60 sec/min * 60 min/hr * 24 hr) / 3 sec/poll. Aka 24 hours.
throw 'ResourceWillNeverBeReady';
}
console.log("polling " + uri);
request({
url: "http://localhost:2500/" + uri,
followRedirect: false
}, function (error, response, body) {
if(response.statusCode === 303) {
// callback handles requesting the actual data
callback(response.headers.location);
return;
}
setTimeout(function() { pollQueue(uri, timesPolled + 1, callback);}, 3000);
});
}