正确重复 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),其中链如下:


我想要实现的是 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
        })
    };

};

除非有更好的解决方案出现,否则我认为这是可以接受的。