Javascript 如何正确地迭代API键数组以同步地发出请求?
我对这个项目做了很多研究,我想知道最好的方法是什么。这是一个扫描twitter新推文的脚本。 它可能有根本性的缺陷,我甚至都不知道。 基本上,我有多个API键,并且在键之间以交错的速率运行请求 获取现有推文:Javascript 如何正确地迭代API键数组以同步地发出请求?,javascript,arrays,web-scraping,foreach,promise,Javascript,Arrays,Web Scraping,Foreach,Promise,我对这个项目做了很多研究,我想知道最好的方法是什么。这是一个扫描twitter新推文的脚本。 它可能有根本性的缺陷,我甚至都不知道。 基本上,我有多个API键,并且在键之间以交错的速率运行请求 获取现有推文: const Twitter = require("twitter"); var i = 0; var store = []; var clients = [ new Twitter({ consumer_key: "", consumer_sec
const Twitter = require("twitter");
var i = 0;
var store = [];
var clients = [
new Twitter({
consumer_key: "",
consumer_secret: "",
access_token_key: "",
access_token_secret: "",
}),
new Twitter({
consumer_key: "",
consumer_secret: "",
access_token_key: "",
access_token_secret: "",
}),
]
const users = [
'twitteruser1',
'twitteruser2',
]
users.forEach(function (user) {
clients[0].get("statuses/user_timeline", { screen_name: user, count: 1 }, (error, tweets, response) => {
store.push(tweet.id_str)
})
})
我需要以下方面的帮助(跟踪新推文的多个帐户):
我一开始是用它写的,但它没有正常工作,因为它可能写得很糟糕。我试着用很多方法重写它,使它工作得很好,效率很高。地图在这里有用吗
每个API密钥的速率限制为900/900秒,因此我根据我拥有的密钥数计算不受速率限制所需的延迟,并每1秒运行一次。例如,20个键意味着我每秒可以有20个请求,这意味着50毫秒的间隔为1秒
谢谢你的帮助。我不是Twitter API的专家,我不太清楚为什么你有/需要多个API键(除了这一点)。我还是不太明白你想做什么 现在,让JavaScript中的异步任务看起来同步的一种方法是使用
async/await
。如果函数不使用承诺,您可以自己将其包装成承诺(尽管RxJS是处理异步操作的新的首选方式):
consttwitter=require(“Twitter”);
常量存储=[];
常量用户=[
“twitteruser1”,
“twitteruser2”,
];
常量客户端=[
新推特({
用户密钥:“,
消费者的秘密:“,
访问令牌密钥:“”,
访问令牌密钥:“”,
}),
新推特({
用户密钥:“,
消费者的秘密:“,
访问令牌密钥:“”,
访问令牌密钥:“”,
}),
];
函数getTweets(客户端、用户、api){
const url=api | |“状态/用户时间线”;
返回新承诺((解决、拒绝)=>{
get(url,{screen_name:user,count:1},(错误,tweets,响应)=>{
如果(错误){
解析({错误,响应});
}否则{
解析({tweets,response});
}
});
});
}
异步函数trackTweets(){
for(客户端的常量客户端){
for(const user of users){
const results=await getTweets(客户端、用户);
if(results.error){
//做错误处理
}否则{
//已定义results.tweets。应对列出的进行排序,以便不需要.some循环调用
如果(存储[0]!==results.tweets[0].id\u str){
store.unshift(results.tweets[0].id\u str);
console.log('newtweet!')
}
}
}
}
}
trackTweets();
//或在间隔时间/超时时间等。
const intervalDuration=(1000/clients.length)*(clients.indexOf(client)%clients.length);
setInterval(trackTweets,intervalDuration);
现在,对于这样的情况,也许值得研究数据流,而不是进行连续的API调用?
查看这些链接,有很多有效的方法可以实现这一点:
- (他们的推特流媒体就在他们的主页上)
clients.forEach(function (client) {
setTimeout(() => {
setInterval(() => {
client.get("statuses/user_timeline", { screen_name: params[???], count: 1}, (error, tweets, response) => {
if (error) return console.log(error);
if (!store.some(found => found == tweets[0].id_str)) {
store.push(tweets[0].id_str)
console.log('new tweet!')
}
})
}, 1000)
}, (1000 / clients.length) * (clients.indexOf(client) % clients.length))
})