Я хотел бы создать живой канал для первой страницы Reddit с помощью API. Поскольку у него очень ограниченная поддержка Websocket, я думал, что буду использовать неоптимальное решение: моя программа будет получать последние сообщения с определенной частотой и добавлять некоторые данные из них в таблицу HTML.Правильный повтор доступа к API
Чтобы обеспечить некоторый код, вот сокращенный вариант того, что я делаю:
//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
.afterAuth
использует идентификационный токен (если я правильно помню) как вход и функционирует как «обертка», чтобы иметь возможность запускать несколько API-запросов.В этом примере
accessAPI
используется для запроса GET AJAX, который напрямую обращается к ссылке oauth.reddit.com, из которой он извлекает данные субредда.Я манипулирую этими данными через его обратный вызов успеха, который здесь представляет собой простую демонстрационную функцию.
То, что я хочу, чтобы достичь является периодическим вызовом accessAPI
так, что она запускает свой обратный вызов на последних сообщения, как время идет.
Из-за асинхронного характера этих вызовов (я полагаю), ни setInterval
, ни петли setTimeout
, по-видимому, являются жизнеспособным решением.
Что еще я могу сделать, чтобы произвести этот периодический вызов?
(само собой разумеется, неоднократный вызов Auth()
непрактичен, но я не могу видеть, как я могу манипулировать внутренний поток иначе.)
В чем проблема с использованием 'setInterval'? как часто данные необходимо обновлять? – Jag
@JAG в теории, это не очень хорошо работает с асинхронными вызовами. На практике, однако, он не повторяет вызовы, по-видимому, но останавливается после одного прогона. –
Я не знаю, что вы имеете в виду, потому что он не повторяет вызовы, ... я создал [jsfiddle] (http://jsfiddle.net/g7ty4Lph/) с 'setTimeout' – Jag