请求超时

时间:2011-08-10 11:37:50

标签: javascript jquery timeout twitter

我正在使用一些jQuery来显示推文但是一旦达到Twitter API限制,就会发送请求,但只是继续加载和加载。这看起来不太好。我希望能够确定请求是否花费太长时间,然后显然做了一些事情,比如取消请求,更改样式等等。


所以这是发送请求的代码:

var fileref = document.createElement('script');

fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src", "http://search.twitter.com/search.json?q="+buildString+"&callback=TweetTick&rpp=50");

document.getElementsByTagName("head")[0].appendChild(fileref);

这是TweetTick功能:

function TweetTick(ob)
{
var container=$('#tweet-container');
container.html('');

$(ob.results).each(function(el){

    /* in here, a div is built for each tweet and then appended to container */

});

container.jScrollPane(); /* just adds the scrollbar */
}

3 个答案:

答案 0 :(得分:2)

您需要在服务器端缓存twitter api响应。

How do I keep from running into the rate limit?

答案 1 :(得分:1)

我最近遇到了一个非常类似的问题。我使用Remy Sharp的这个脚本来处理我的大部分Twitter请求:http://remysharp.com/2007/05/18/add-twitter-to-your-blog-step-by-step/

您需要了解的是api超时是每个IP地址。因此,如果api根据您的测试时间超时,则不会为其他IP地址上的其他人超时。现在,如果访问该网站的某个人在公司或企业内这样做,并且同一地方的其他人也在这样做,那么该超时几乎会立即发生。

要解决此问题,您需要缓存结果。我这样做的方式如下。

我使用以下代码创建了一个twitter缓存系统:

$twitter_username = "tadywankenobi"; //
$number_of_tweets = "10";

$options[CURLOPT_URL] = 'http://api.twitter.com/1/statuses/user_timeline.xml?screen_name='.$twitter_username.'&count='.$number_of_tweets.'&include_rts=1';
$options[CURLOPT_PORT] = 80;
$options[CURLOPT_FOLLOWLOCATION] = true;
$options[CURLOPT_RETURNTRANSFER] = true;
$options[CURLOPT_TIMEOUT] = 60;

$tweets = cache($options);

$twxml = new SimpleXMLElement($tweets);

echo "<ul>";
for($i=0;$i<=($number_of_tweets-1);$i++){
    $text = $twxml->status[$i]->text;
    echo "<li>".auto_link_twitter($text)."</li>";
}
echo "</ul>";

function cache($options) {

    $cache_filename = "/var/cache/tweets.xml";
    if(!file_exists($cache_filename)){
        $handle = fopen($cache_filename, 'w') or die('Cannot open file:  '.$my_file);
        fclose($handle);
    }// Check if cache file exists and if not, create it

    $time_expire = filectime($cache_filename) + 60*60; // Expire Time (1 hour) // Comment for first run
    // Set time to check file against

    if(filectime($cache_filename) >= $time_expire || filesize($cache_filename) == 0) {
        // File is too old or empty, refresh cache
        $curl = curl_init();
        curl_setopt_array($curl, $options);
        $response = curl_exec($curl);
        curl_close($curl);
        if($response){
            file_put_contents($cache_filename, $response);
        }
        else{
            unlink($cache_filename);
        }
    }else{
        $response = file_get_contents($cache_filename);
    }
    return $response;
}

最后的缓存功能是在服务器上创建一个文件并将twitter xml反馈存储在那里。然后系统检查该文件的年龄,如果它比一小时还小,则从那里获取结果。否则,它会重新访问twitter。您需要将文件写入/ var / cache文件夹(如果不存在则创建它)。

我有点将这些代码整理到一起,所以如果你遇到任何问题,请告诉我。它还使用auto_link_twitter()函数,该函数创建twitter文本中所需的链接。我没有写那个,所以我现在试着找到你的链接。

希望一切都有所帮助,

Ť

更新:我不记得我在哪里获得了auto_link_twitter()函数,所以在这里。如果写这篇文章的人读了这篇文章,我很抱歉,我再也找不到来源了。

function auto_link_twitter($text) {
    // properly formatted URLs
    $urls = "/(((http[s]?:\/\/)|(www\.))?(([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+\.[a-z]+(\.[a-z]{2,2})?)\/?[a-z0-9._\/~#&=;%+?-]+[a-z0-9\/#=?]{1,1})/is";
    $text = preg_replace($urls, " <a href='$1'>$1</a>", $text);

    // URLs without protocols
    $text = preg_replace("/href=\"www/", "href=\"http://www", $text);

    // Twitter usernames
    $twitter = "/@([A-Za-z0-9_]+)/is";
    $text = preg_replace ($twitter, " <a href='http://twitter.com/$1'>@$1</a>", $text);

    // Twitter hashtags
    $hashtag = "/#([A-Aa-z0-9_-]+)/is";
    $text = preg_replace ($hashtag, " <a href='http://twitter.com/#!/search?q=%23$1'>#$1</a>", $text);
    return $text;
}

答案 2 :(得分:0)

您可以使用特定的jQuery方法来发出JSONP请求。基本$.ajax方法和速记方法$.getJSON更适合您。要控制请求的超时,可以使用timeout参数。可以使用错误回调处理请求超出超时。

$.ajax(
    dataType: 'jsonp',
    url: 'http://search.twitter.com/search.json',
    data: {
        q: buildString,
        rpp: 50         
    },
    jsonpCallback: 'TweetTick',
    timeout: 30000,
    error: function(jqXHR, textStatus, errorThrown) {
        if (textStatus == 'timeout') {
            alert('timeout exceeded');
        }
    }    
);