2017-02-08 38 views
0

我想通過使用API​​爲Reddit的首頁創建一個實時源。由於它對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),這家連鎖店如下:

  • 如果成功,Auth內的POST AJAX請求將調用afterAuth

  • afterAuth使用一個標識符(如果我沒記錯的話)作爲輸入,並且作爲一個「包裝器」來運行多個API訪問。

  • 在此示例中,accessAPI用於GET AJAX請求,該請求直接訪問oauth.reddit.com鏈接,從該鏈接獲取subreddit數據。

  • 我通過它的成功回調來處理這些數據,這裏是一個簡單的演示函數。


我想實現的是,這樣它隨着時間的推移運行其上最近的帖子回調accessAPI定期調用。

由於這些調用的異步性質(我認爲),setInterval和環setTimeout似乎都不是一個可行的解決方案。

我還能做些什麼來產生這個定期的呼叫?

(不用說,的Auth()反覆的呼喚是不切實際的,但我看不到,我怎麼能操縱內部流除外。)

+0

使用'setInterval'有什麼問題?多久需要刷新數據? – Jag

+0

@JAG在理論上,它在異步調用中並不能很好地工作。但在實踐中,它顯然不會重複呼叫,而是在一次運行後停止。 –

+0

我不知道你的意思'它不重複調用,...'我用'setTimeout'創建了一個[jsfiddle.net/g7ty4Lph/] – Jag

回答

0

我能同時找到一個解決方案。

關鍵是通過使用加號輸入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 
     }) 
    }; 

}; 

除非有更好的解決方案,否則我認爲它是可以接受的解決方案。