正确重复 API 访问
Proper repeat of API access
我想使用 API 为 Reddit 的首页创建一个实时提要。由于它对 Websocket 的支持非常有限,我想我会使用一个次优的解决方案:我的程序会以一定的频率获取最新的帖子,并将它们的一些数据附加到 HTML table.
为了提供一些代码,这里是我正在做的一个简化版本:
//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)
,其中链如下:
POSTAJAX请求在Auth
内,如果成功,调用afterAuth
.
afterAuth
使用标识标记(如果我没记错的话)作为输入并作为 "wrapper" 能够 运行 多个 API访问。
在此示例中,accessAPI
用于直接访问 oauth.reddit.com link 的 GET AJAX 请求,从中获取 subreddit数据.
我通过它的成功回调来操作这个数据,这里是一个简单的演示函数。
我想要实现的是 accessAPI
的定期调用,以便它 运行 随着时间的推移对最近的帖子进行回调。
由于这些调用的异步性质(我推测),setInterval
和循环 setTimeout
似乎都不是可行的解决方案。
我还能做些什么来产生这个定期调用?
(不用说,重复调用Auth()
是不切实际的,但我看不到,否则我如何操纵内部流程。)
我可以同时找到解决方案。
关键是通过使用加号输入 repeat
将一些 "flow control" 添加到 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
})
};
};
除非有更好的解决方案出现,否则我认为这是可以接受的。
我想使用 API 为 Reddit 的首页创建一个实时提要。由于它对 Websocket 的支持非常有限,我想我会使用一个次优的解决方案:我的程序会以一定的频率获取最新的帖子,并将它们的一些数据附加到 HTML table.
为了提供一些代码,这里是我正在做的一个简化版本:
//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)
,其中链如下:
POSTAJAX请求在
Auth
内,如果成功,调用afterAuth
.afterAuth
使用标识标记(如果我没记错的话)作为输入并作为 "wrapper" 能够 运行 多个 API访问。在此示例中,
accessAPI
用于直接访问 oauth.reddit.com link 的 GET AJAX 请求,从中获取 subreddit数据.我通过它的成功回调来操作这个数据,这里是一个简单的演示函数。
我想要实现的是 accessAPI
的定期调用,以便它 运行 随着时间的推移对最近的帖子进行回调。
由于这些调用的异步性质(我推测),setInterval
和循环 setTimeout
似乎都不是可行的解决方案。
我还能做些什么来产生这个定期调用?
(不用说,重复调用Auth()
是不切实际的,但我看不到,否则我如何操纵内部流程。)
我可以同时找到解决方案。
关键是通过使用加号输入 repeat
将一些 "flow control" 添加到 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
})
};
};
除非有更好的解决方案出现,否则我认为这是可以接受的。