我在节点中使用超级代理来调用公共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循环。
答案 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.
});