在我的Meteor 1.0应用程序中,我正在运行一批服务器端HTTP请求,以便以同步方式检索夹具数据。请求完成并对该数据运行计算后,startNumber
会递增(乘以5000),并使用该新值重新运行请求。此循环系统将继续,直到API返回空白响应数组,表示已捕获所有数据。此HTTP请求是更大,更复杂的函数的一部分,可帮助设置请求的上下文。
functionName = function(param1,param2,param3) {
// ...
// ...
var startNumber = 1;
do {
var request = Meteor.http.call("GET", "https://url-to-api-endpoint",
{ params:
{
"since": startNumber
},
timeout: 60000
}
);
if(request.statusCode === 200) {
var response = request.data;
// perform calculations on the response
startNumber+=5000;
}
} (while response.length>0);
// ...
// ...
};
do-while循环系统工作正常,但请求返回Error: getaddrinfo ENOTFOUND
的每几次迭代除外。该URL完全有效,并且看起来这些错误是由于挑剔/不可靠的API导致的,因为有时相同的确切请求将经历或错误输出。我想重播失败的请求,以确保我的应用程序在继续之前按时间顺序检索数据。
如何重播失败的HTTP请求,好像它是第一次运行一样?换句话说,在functionName
?
答案 0 :(得分:1)
仅供参考,如果其他人最终陷入困境,我通过在try-catch块中包装HTTP请求来解决这个问题。如果出现getaddrinfo ENOTFOUND
或ETIMEDOUT
等错误,则会捕获错误。在catch块中,我调用functionName
并传入当前状态的参数(即当前startNumber
) - 这使我能够重新“重播”该请求。
// ...
// ...
try {
var request = Meteor.http.call("GET", "https://url-to-api-endpoint",
{ params:
{
"since": startNumber
},
timeout: 60000
}
);
} catch(err) {
console.log(err + '\nFailed...retrying');
functionName(param1,param2,param3);
}
// ...
// ...