Javascript 如何正确地迭代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

我对这个项目做了很多研究,我想知道最好的方法是什么。这是一个扫描twitter新推文的脚本。 它可能有根本性的缺陷,我甚至都不知道。 基本上,我有多个API键,并且在键之间以交错的速率运行请求

获取现有推文:

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调用? 查看这些链接,有很多有效的方法可以实现这一点:

  • (他们的推特流媒体就在他们的主页上)

清除间隔并在每个客户端成功/失败时再次调用该间隔是否有效?这是针对节点脚本还是前端代码?由于速率限制,我需要使用多个api键。以我拥有的密钥数量,我可以每50毫秒提交一个请求。流式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))
})