JS Get Calls互相等待

时间:2016-08-23 19:34:23

标签: javascript

我有一个函数用于发送请求包的GET http请求。 这很好用。

//file1.js
var request = require('request');
methods.testcall = function(callback){
    request(url, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            callback(body)
        }
        if(!error && response.statusCode == 429){ // Rate limit.., try again 1s
            setTimeout(this(callback), 1000);
        }

    })
};

在下一个文件中,我调用此函数两次。我认为2请求可以一次运行。所以当请求到达时我会调用回调函数。 在日志中我看到了结果。但是,你看到我的评论,我想等待所有testcall(),因为我想确保所有数据都到达我的服务器。

//file2.js
test.methods.testcall(function(response){
    console.log(response)
});

test.methods.testcall(function(response){
    console.log(response)
});

// Here, i want to wait for all testcall function.
// When all testcall function sent response 
// Im ready to do smtng :)

我怎么能在那里等待这两种方法? 非常感谢!

3 个答案:

答案 0 :(得分:1)

这未经过测试,我认为它会对你有用,它正在使用q

Sensor.getReportingMode()

答案 1 :(得分:0)

您可以嵌套testcall调用:

test.methods.testcall(function(response1) {
    test.methods.testcall(function(response2) {
        doSomething(response1, response2)
    }) 
})

在该请求完成之前,不会执行对testcall内部调用的回调,这样您就可以访问这两个响应。

这种方法很难遵循,特别是如果你有更多的电话要求。您必须继续嵌套它们(也称为callback hell

为了简化流程,您还可以使用async.js或Promise库等库,例如Bluebird.js

对于并发请求,请查看此问题的详细方法:How can I wait for set of asynchronous callback functions?

答案 2 :(得分:0)

现在它的作品,好

methods.test = function (callback){


    request(url...., function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log("done");
            callback(body)
        }else if(!error && response.statusCode == 429){ // Rate limit
            console.log("rateLimit");
            setTimeout(function(){
                methods.test(callback)
            },1000);
        }else if(!error && response.statusCode == 403){ // Forbidden
            console.log("Forbidden");
            setTimeout(function(){
                methods.test(callback)
            },1000);
        }


    })
};



var responseNumber = 0;

test.methods.test(function(response){
    responseNumber += 1;
    checkResponse(responseNumber)
});

test.methods.test(function(response){
    responseNumber += 1;
    checkResponse(responseNumber)

});



function checkResponse(responseNumb)
{
    if(responseNumb == 2){
        console.log("done");

    }
}