Meteor - 如何在不丢失上下文的情况下重试失败的HTTP请求?

时间:2014-11-03 03:48:51

标签: javascript node.js meteor

在我的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

中不丢失所有变量等的当前上下文

1 个答案:

答案 0 :(得分:1)

仅供参考,如果其他人最终陷入困境,我通过在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);
}
// ...
// ...