Meteor-如何在不丢失上下文的情况下重试失败的HTTP请求
Meteor - How to Retry Failed HTTP Request without Losing Context?
在我的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 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);
}
// ...
// ...
相关文章:
- 我们如何在不更改url的情况下使用锚点点击从一个页面重定向到另一个页面
- 如何在不进入无限循环的情况下将网站重定向到Facebook画布URL
- 在php中不运行java脚本的情况下重定向页面
- 在不重定向页面的情况下更新表
- 在不使用 JavaScript 的情况下通过 iframe 访问时从页面重定向
- 使用javascript创建Form元素,并在不重定向/刷新的情况下提交
- 如何在不重定向用户的情况下更改地址栏URL(不使用历史API?)
- 防止在没有ajax的情况下提交后重定向表单
- 在没有flash的情况下使用javascript重定向
- 在没有动画的情况下将进度条重置为零(在引导程序中)
- localStorage为用户注册如何在不丢失数据的情况下重定向
- jQuery 示例:在文件扩展名不允许的情况下重置输入文件元素
- 在没有警报框的情况下重定向
- ui-router:在不使用 $state.go() 的情况下重置$state
- Meteor-如何在不丢失上下文的情况下重试失败的HTTP请求
- 防止闭包编译器在不使用括号表示法的情况下重命名属性
- 如何检测用户是否已经打开了一个url,并在已经打开的情况下重定向到相同的url
- 在不重新加载页面的情况下重置innerHTML
- 如何在不重新加载页面的情况下重置事件
- 在不关闭套接字的情况下重启实时node.js服务器