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

Meteor - How to Retry Failed HTTP Request without Losing Context?

本文关键字:情况下 重试 失败 请求 HTTP 上下文 Meteor-      更新时间:2023-09-26

在我的Meteor 1.0应用程序中,我正在运行一批服务器端HTTP请求,以便以同步方式检索fixture数据。一旦请求完成并对该数据进行计算,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中所有变量等的当前上下文的情况下?

FYI,如果其他人最终陷入这种困境,我通过将HTTP请求封装在try-catch块中来解决这个问题。在出现诸如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);
}
// ...
// ...