Javascript 正确重复API访问
我想使用API为Reddit的首页创建一个实时提要。由于它对Websocket的支持非常有限,我想我应该使用次优的解决方案:我的程序将以一定的频率获取最新的帖子,并将其中的一些数据附加到HTML表中 为了提供一些代码,下面是我正在做的一个简短版本:Javascript 正确重复API访问,javascript,jquery,ajax,reddit,Javascript,Jquery,Ajax,Reddit,我想使用API为Reddit的首页创建一个实时提要。由于它对Websocket的支持非常有限,我想我应该使用次优的解决方案:我的程序将以一定的频率获取最新的帖子,并将其中的一些数据附加到HTML表中 为了提供一些代码,下面是我正在做的一个简短版本: //cliendID and clientSec are declared vars I omit for safety reasons function Auth(callback){ //Authorization to Reddit AP
//cliendID and clientSec are declared vars I omit for safety reasons
function Auth(callback){
//Authorization to Reddit API
$.ajax({
type: 'POST',
url: "https://www.reddit.com/api/v1/access_token",
beforeSend: function(xhr) {
xhr.setRequestHeader(
"Authorization",
"Basic " + btoa(clientID + ":" + clientSec));
},
data:
{
grant_type: "client_credentials",
user: clientID,
password: clientSec
},
success: callback
});
}
//params.listing and APIurl are also declared
function afterAuth(token){
accessAPI(token, printResult, params.listing, APIurl);
}
//standardized Reddit API access
function accessAPI(response, callback, inputJSON, url){
//console.log("accessAPI: "+response);
$.ajax({
type: 'GET',
url: /* an oauth.reddit.com link */,
beforeSend: function(xhr) {
xhr.setRequestHeader("Authorization", response.token_type + " " + response.access_token);
},
data: /* input necessary for that API request */
success: callback
});
};
//test function, for demonstration purposes
function printResult(querydat){
console.log(querydat);
}
我的程序所做的只是一个简单的调用:Auth(afterAuth)
,其中链如下:
中的POST-AJAX请求如果成功,将调用Auth
afterAuth
使用标识令牌(如果我没记错的话)作为输入,并作为“包装器”运行多个API访问afterAuth
- 在本例中,
用于GET AJAX请求,该请求直接访问oauth.reddit.com链接,从该链接获取subreddit数据accessAPI
- 我通过它的成功回调来操作这些数据,这是一个简单的演示函数
function accessAPI(access_token, callback, inputJSON, url, repeat){
if(repeat==0){ accessAPI_Execute();
}else{ setInterval(accessAPI_Execute, repeat*1000)};
//local function for setInterval() control
function accessAPI_Execute(){
//console.log("sending request...");
$.ajax({
type: 'GET',
url: url,
beforeSend: function(xhr) {
xhr.setRequestHeader("Authorization", access_token.token_type + " " + access_token.access_token);
},
data: inputJSON,
success: callback
})
};
};
我想要实现的是定期调用
accessAPI
,以便随着时间的推移,它在最近的帖子上运行回调
由于这些调用的异步性质(我认为),无论是setInterval
还是循环setTimeout
似乎都不是可行的解决方案
我还可以做些什么来生成此定期通话?
(不用说,重复调用
Auth()
是不切实际的,但我看不出,否则如何操作内部流。)我可以同时找到解决方案
关键是使用一个加号输入,repeat
将一些“流控制”添加到accessAPI
AJAX调用本身现在位于accessAPI
范围内的另一个函数中,因此setInterval
重复单独的函数
function accessAPI(access_token, callback, inputJSON, url, repeat){
if(repeat==0){ accessAPI_Execute();
}else{ setInterval(accessAPI_Execute, repeat*1000)};
//local function for setInterval() control
function accessAPI_Execute(){
//console.log("sending request...");
$.ajax({
type: 'GET',
url: url,
beforeSend: function(xhr) {
xhr.setRequestHeader("Authorization", access_token.token_type + " " + access_token.access_token);
},
data: inputJSON,
success: callback
})
};
};
<> P>除非有更好的解决方案,否则我认为它是被接受的。< /P>使用<代码> SETIFATION< /COD>有什么不对吗?数据需要多长时间刷新一次?@JAG理论上,异步调用的效果并不好。但实际上,它显然不会重复调用,而是在一次运行后停止。我不知道你的意思
它不会重复调用,
我已经创建了一个带有设置超时的@JAG,我可以解决问题,因为,请参考答案。不过,作为额外的一点,谢谢你的提琴,它表明我失败了,因为我忘了在使用setInterval时调用另一个无名函数中的函数。