同步javascript调用节点js-在for循环中执行GET

时间:2016-03-09 23:16:07

标签: javascript node.js synchronous

我在节点中使用超级代理来调用公共API,想知道是否有办法与它进行同步调用?我喜欢它,因为它在所有调用中都有自动缓存,但我看起来在线,它似乎没有同步调用。

我正在做2个逻辑块,两个for循环都包含对API的多次调用。我想等待第一个for循环,多个调用完成,所以它的所有信息都可以传递给第二个for循环。

我的代码有点复杂,不太容易理解,但是无论如何都是这样。

// Declared all of the variables up here
var request = require('superagent-cache')();

for (i = 0; i < summonerNameArray.length; i++) {
    console.log("Count: " + i);
    summonersToSendToBasic.push(summonerNameArray[i].summonerName);

    // Every 10 we can send the basic request to RIOT's API 
    if (i % 9 == 0 && i != 0 || i == summonerNameArray.length - 1) {
        console.log("Sending these summoners to basic API call: " + summonersToSendToBasic);
        var URL = "https://euw.api.pvp.net/api/lol/euw/v1.4/summoner/by-name/" 
            + summonersToSendToBasic 
            + "?api_key=" 
            + APIKey;

        request
        .get(URL)
        .end(function(err, res) {
            if (res.statusCode != 404 || res.statusCode != 400) {
                console.log(res.body);
                console.log(JSON.stringify(res.body));

                //TODO ~~ Fix this to make it more efficient
                for (var username in res.body) {
                    console.log(res.body[username].id);
                    IDsToSendToRanked.push(res.body[username].id);
                }
            } 
        });

        // Clear the Array to start the whole process over again
        summonersToSendToBasic = [];
    }
}


for (i = 0; i < IDsToSendToRanked.length; i++) {
    //TODO - Work out how to nest these, should be fine but what is actually happening? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    IDsToSendToRankedCounted.push(IDsToSendToRanked[i]);

     if (i % 39 == 0 && i != 0 || i == IDsToSendToRanked.length - 1) {
        // Here we add them to IDsToSendToRankedCounted
        console.log("Sending these summoners to ranked API call: " + IDsToSendToRankedCounted);
        var URL = "https://euw.api.pvp.net/api/lol/euw/v2.5/league/by-summoner/" 
            + summonersToSendToBasic 
            + "/entry?api_key=" 
            + APIKey;

        request
        .get(URL)
        .end(function(err, res) {
            if (res.statusCode != 404 || res.statusCode != 400) {
                console.log(res.body);

                finalUniversityArray.push(res.body);
            } 
        });

        IDsToSendToRankedCounted = [];
     }
}

基本上我希望IDsToSendToRanked包含所有ID,然后才进入第二个for循环。

1 个答案:

答案 0 :(得分:0)

据我所知,不可能有同步请求。无论如何,还有其他方法可以达到你想要的结果。

如果你可以在你的项目中引入更多的库,那么我建议你使用这个库:https://www.npmjs.com/package/promise这样的承诺,这样你可以做类似的事情:

var promiseOfIds = new Promise(function(resolve, reject) {
    request.get(url).end(function(err, response){
        if(err) {
            reject(err);
        } else {
            // Here you can modify the response as you like. 
            resolve(response)
        }
    })
});
promiseOfIds.then(function(ids){
    // DO the second request with loaded ids. 
});