Javascript node.js异步请求是否超时?
在node.js中,如果异步调用花费的时间太长(或没有完成)并触发默认回调,是否可以进行超时的异步调用 详情如下: 我有一个node.js服务器,它接收一个请求,然后在响应之前在后台异步发出多个请求。一个问题涵盖了基本问题,但其中一些电话被认为是“很好”。我的意思是,如果我们得到回复,那么它会增强对客户的响应,但是如果他们花太长时间来响应,那么最好及时响应客户,而不是使用这些响应 同时,这种方法可以防止服务根本没有完成或失败,同时允许操作的主线程做出响应Javascript node.js异步请求是否超时?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,在node.js中,如果异步调用花费的时间太长(或没有完成)并触发默认回调,是否可以进行超时的异步调用 详情如下: 我有一个node.js服务器,它接收一个请求,然后在响应之前在后台异步发出多个请求。一个问题涵盖了基本问题,但其中一些电话被认为是“很好”。我的意思是,如果我们得到回复,那么它会增强对客户的响应,但是如果他们花太长时间来响应,那么最好及时响应客户,而不是使用这些响应 同时,这种方法可以防止服务根本没有完成或失败,同时允许操作的主线程做出响应 你可以用同样的方式来看待这一点,即谷歌搜
你可以用同样的方式来看待这一点,即谷歌搜索有一组核心结果,但基于其他幕后查询提供额外的响应。如果它很简单,只需使用setTimout即可
app.get('/', function (req, res) {
var result = {};
// populate object
http.get('http://www.google.com/index.html', (res) => {
result.property = response;
return res.send(result);
});
// if we havent returned within a second, return without data
setTimeout(function(){
return res.send(result);
}, 1000);
});
编辑:正如peteb提到的,我忘了检查我们是否已经发送了。这可以通过使用res.headerSent或自己维护“发送”值来实现。我还注意到res变量被重新分配
app.get('/', function (req, res) {
var result = {};
// populate object
http.get('http://www.google.com/index.html', (httpResponse) => {
result.property = httpResponse;
if(!res.headersSent){
res.send(result);
}
});
// if we havent returned within a second, return without data
setTimeout(function(){
if(!res.headersSent){
res.send(result);
}
}, 1000);
});
您可以尝试使用超时。例如,使用以下方法:
- 设置超时处理程序:var timeOutX=setTimeout(函数
- 将该变量设置为null:timeOutX=null(表示超时已触发)
- 然后用一个参数执行回调函数(错误处理):回调({error:'theasync request timed out'})
- 为超时功能添加时间,例如3秒
var timeoutX = setTimeout(function() {
timeOutX = null;
yourCallbackFunction({error:'The async request timed out'});
}, 3000);
yourAsyncFunction(yourArguments, function() {
if (timeOutX) {
clearTimeout(timeOutX);
yourCallbackFunction();
}
});
- 有了这个集合,您就可以调用异步函数并进行超时检查,以确保您的超时处理程序尚未启动。 最后,在运行回调函数之前,必须使用该方法清除计划超时处理程序
var timeoutX = setTimeout(function() {
timeOutX = null;
yourCallbackFunction({error:'The async request timed out'});
}, 3000);
yourAsyncFunction(yourArguments, function() {
if (timeOutX) {
clearTimeout(timeOutX);
yourCallbackFunction();
}
});
检查这个超时回调示例
如果超时,您可以修改它以执行操作,或者只是捕获错误。检查异步模块,确保它是可能的。只需输入
setTimeout
并确定首先调用哪个回调(超时或请求)。或者简单地使用承诺和Promise.race
彼此竞争。@Bergi的Promise.race
思想是最干净的解决方案。。好吧,值得学习PromiseAPI。只要跳上Promise.race
乐队,检查一下。考虑到alre有多么复杂或容易出错,这是一种更简单、更干净的方法ady给出的答案是。更好的方法是Bluebird的Promise.any()
,因为它比所描述的标准a+竞速方法有一些改进。调用res.send
两次可以吗?如果setTimeout(),这将导致http.get()
回调中的res.send()
出错
已被调用。需要在http.get()
回调中的res.send()
之前检查res.headersSent
,以及setTimeout()
。