Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正确重复API访问_Javascript_Jquery_Ajax_Reddit - Fatal编程技术网

Javascript 正确重复API访问

Javascript 正确重复API访问,javascript,jquery,ajax,reddit,Javascript,Jquery,Ajax,Reddit,我想使用API为Reddit的首页创建一个实时提要。由于它对Websocket的支持非常有限,我想我应该使用次优的解决方案:我的程序将以一定的频率获取最新的帖子,并将其中的一些数据附加到HTML表中 为了提供一些代码,下面是我正在做的一个简短版本: //cliendID and clientSec are declared vars I omit for safety reasons function Auth(callback){ //Authorization to Reddit AP

我想使用API为Reddit的首页创建一个实时提要。由于它对Websocket的支持非常有限,我想我应该使用次优的解决方案:我的程序将以一定的频率获取最新的帖子,并将其中的一些数据附加到HTML表中

为了提供一些代码,下面是我正在做的一个简短版本:

//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数据

  • 我通过它的成功回调来操作这些数据,这是一个简单的演示函数

  • 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
            })
        };
    
    };
    

我想要实现的是定期调用
accessAPI
,以便随着时间的推移,它在最近的帖子上运行回调

由于这些调用的异步性质(我认为),无论是
setInterval
还是循环
setTimeout
似乎都不是可行的解决方案

我还可以做些什么来生成此定期通话?


(不用说,重复调用
Auth()
是不切实际的,但我看不出,否则如何操作内部流。)

我可以同时找到解决方案

关键是使用一个加号输入,
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
        })
    };

};

<> P>除非有更好的解决方案,否则我认为它是被接受的。< /P>使用<代码> SETIFATION< /COD>有什么不对吗?数据需要多长时间刷新一次?@JAG理论上,异步调用的效果并不好。但实际上,它显然不会重复调用,而是在一次运行后停止。我不知道你的意思
它不会重复调用,
我已经创建了一个带有
设置超时的
@JAG,我可以解决问题,因为,请参考答案。不过,作为额外的一点,谢谢你的提琴,它表明我失败了,因为我忘了在使用setInterval时调用另一个无名函数中的函数。