2017-02-08 5 views
0

Я хотел бы создать живой канал для первой страницы 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() непрактичен, но я не могу видеть, как я могу манипулировать внутренний поток иначе.)

+0

В чем проблема с использованием 'setInterval'? как часто данные необходимо обновлять? – Jag

+0

@JAG в теории, это не очень хорошо работает с асинхронными вызовами. На практике, однако, он не повторяет вызовы, по-видимому, но останавливается после одного прогона. –

+0

Я не знаю, что вы имеете в виду, потому что он не повторяет вызовы, ... я создал [jsfiddle] (http://jsfiddle.net/g7ty4Lph/) с 'setTimeout' – Jag

ответ

0

я мог бы найти решение тем.

Ключ добавлял некоторые «управление потоком» в accessAPI с использованием плюсового ввода, repeat.

Сам вызов 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 
     }) 
    }; 

}; 

Если какое-либо лучшее решение не приходит, я считаю его принятым.

 Смежные вопросы

  • Нет связанных вопросов^_^