具有超时的node.js异步请求?

时间:2016-03-31 15:33:30

标签: javascript node.js asynchronous

在node.js中,是否有可能进行异步调用,如果它花费的时间太长(或者没有完成)并触发默认回调而超时?

细节:

我有一个node.js服务器接收请求,然后在响应之前在后台异步发出多个请求。 existing问题涉及基本问题,但其中一些电话被视为“很好”。我的意思是,如果我们得到回复,那么它会增强对客户的响应,但如果他们花费太长时间来回应,那么及时回应客户比回应客户更好。

同时,这种方法可以防止完全或失败的服务,同时允许主操作线程做出响应。

您可以将此想法与具有一组核心结果的Google搜索相同,但根据其他幕后查询提供额外回复。

3 个答案:

答案 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 ...
  • 将该变量设置为null:timeOutX = NULL(表示已触发超时)
  • 然后用一个参数执行你的回调函数(错误处理):回调({错误:'异步请求超时'});
  • 您可以为超时功能添加时间,例如3秒

这样的事情:

var timeoutX = setTimeout(function() {
    timeOutX = null;

    yourCallbackFunction({error:'The async request timed out'});

}, 3000);
  • 使用该集,您可以调用异步函数并进行超时检查以确保您的超时处理程序尚未启动。 最后,在运行回调函数之前,必须使用clearTimeout()方法清除该计划的超时处理程序。

这样的事情:

yourAsyncFunction(yourArguments, function() {
    if (timeOutX) {
        clearTimeout(timeOutX);
        yourCallbackFunction();
    }
});

答案 2 :(得分:0)

检查此超时回调示例https://github.com/jakubknejzlik/node-timeout-callback/blob/master/index.js

你可以修改它,以便在时间结束或只是捕捉错误时采取行动。