meteor – 如何重试失败的HTTP请求而不丢失上下文?

在我的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请求,就好像它是第一次运行一样? 换句话说,在不丢失所有variables的当前上下文等情况下,在functionName

仅供参考,因为有人在这个困境中结束了,我通过在try-catch块中包装HTTP请求来解决这个问题。 在getaddrinfo ENOTFOUNDETIMEDOUT等错误的情况下,错误被捕获。 在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); } // ... // ...