Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js异步请求是否超时?_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript node.js异步请求是否超时?

Javascript node.js异步请求是否超时?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,在node.js中,如果异步调用花费的时间太长(或没有完成)并触发默认回调,是否可以进行超时的异步调用 详情如下: 我有一个node.js服务器,它接收一个请求,然后在响应之前在后台异步发出多个请求。一个问题涵盖了基本问题,但其中一些电话被认为是“很好”。我的意思是,如果我们得到回复,那么它会增强对客户的响应,但是如果他们花太长时间来响应,那么最好及时响应客户,而不是使用这些响应 同时,这种方法可以防止服务根本没有完成或失败,同时允许操作的主线程做出响应 你可以用同样的方式来看待这一点,即谷歌搜

在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()