在node.js中,是否有可能进行异步调用,如果它花费的时间太长(或者没有完成)并触发默认回调而超时?
细节:
我有一个node.js服务器接收请求,然后在响应之前在后台异步发出多个请求。 existing问题涉及基本问题,但其中一些电话被视为“很好”。我的意思是,如果我们得到回复,那么它会增强对客户的响应,但如果他们花费太长时间来回应,那么及时回应客户比回应客户更好。
同时,这种方法可以防止完全或失败的服务,同时允许主操作线程做出响应。
您可以将此想法与具有一组核心结果的Google搜索相同,但根据其他幕后查询提供额外回复。
答案 0 :(得分:1)
如果简单,只需使用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或自己维护'sent'值来实现。我还注意到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);
});
答案 1 :(得分:0)
您可以尝试使用超时。例如,使用setTimeout()方法:
这样的事情:
var timeoutX = setTimeout(function() {
timeOutX = null;
yourCallbackFunction({error:'The async request timed out'});
}, 3000);
这样的事情:
yourAsyncFunction(yourArguments, function() {
if (timeOutX) {
clearTimeout(timeOutX);
yourCallbackFunction();
}
});
答案 2 :(得分:0)
检查此超时回调示例https://github.com/jakubknejzlik/node-timeout-callback/blob/master/index.js
你可以修改它,以便在时间结束或只是捕捉错误时采取行动。