在Node.js中发送多个异步HTTP请求

时间:2019-11-26 22:13:27

标签: node.js http asynchronous request

我的目标是为列表中的每个对象(每个对象2个)发送多个异步HTTP请求,间隔为125毫秒(无论之前的请求/查询是否完成)。异步请求至关重要,因为这样可以节省大量时间。截至目前,我的代码可以正常工作,但是出现了问题。这些请求似乎重叠在一起,我从另一个请求中获取数据,而不是从应该从中获得响应的确切请求(响应延迟)中获取数据。请注意,query1不依赖于query2,但是在完成 query 函数之前,它们都必须同时执行。我的代码如下:

var list = [
    object1, 
    object2, 
    object3,
    ...

]
setInterval(function loop()
{
    query((list).shift());
    return;
}, 125);

function query(currentObj)
{
    var query1 = undefined;
    var error1 = false;
    var query2 = undefined;
    var error2 = false;

    query1(function(err, data)
    {
        if(!err)
        {
            query1 = data;
            return;
        }
        else
        {
            error1 = true;
            return;
        }
    });
    query2(function(err, data)
    {
        if(!err)
        {
            query2 = data;
            return;
        }
        else
        {
            error2 = true;
            return;
        }
    });

    function query1(callback)
    {
        Request("https://something.com/1"+ currentObj, function(error1, response, body) {
            if (!error1 && response.statusCode == 200) 
            {
                result = JSON.parse(body);
                return callback(null, result);
            } 
            else 
            {
                return callback(error1, null);
            }
        });
    }
    function query2(callback)
    {
        Request("https://something.com/2"+ currentObj, function(error2, response, body) {
            if (!(error2) && response.statusCode == 200) 
            {
                result = JSON.parse(body);
                return callback(null, result);
            } 
            else 
            {
                return callback(error2, null);
            }
        });
    }

    checkQuery1();
    function checkQuery1() 
    {
        if(error1 == true){return;}
        else if(query1 == undefined) {
            setTimeout(checkQuery1, 1);
            return;
        }
        var value1 = query1;

        checkQuery2();
        function checkQuery2() 
        {
            if(error2 == true){return;}
            else if(query2 == undefined) {
                setTimeout(checkQuery2, 1);
                return;
            }
            var value2 = query2;

            //DO SOME STUFF
            return;
        }
        return;
    }
    return;
}

我试图在调用下一个查询之前等待每个查询执行,但是这种方法违反了异步请求的目的,尽管它确实可以工作。有什么想法可以使我工作吗?

0 个答案:

没有答案