Запрос времени ожидания - PullRequest
2 голосов
/ 10 августа 2011

Я использую некоторые 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 ]

2 голосов
/ 10 августа 2011

Вам необходимо кэшировать ответ Twitter API на вашем сервере.

Как мне не попасть в ограничение скорости?

1 голос
/ 10 августа 2011

У меня была очень похожая проблема в последнее время.Я использую этот скрипт Реми Шарпа для большинства моих запросов в твиттере: http://remysharp.com/2007/05/18/add-twitter-to-your-blog-step-by-step/

Что вам нужно понять, так это то, что таймаут API соответствует IP-адресу.Таким образом, если время ожидания API для вас истекло на основании вашего тестирования, оно не будет превышено для другого человека с другим IP-адресом.Теперь, если кто-то обращается к сайту в корпорации или в бизнесе, а другие в том же месте делают то же самое, этот тайм-аут будет происходить почти мгновенно.

Чтобы обойти это, вам нужно кэшировать свои результаты.,Я сделал это следующим образом.

Я создал систему кэширования в твиттере, используя следующий код:

$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 там.Затем система проверяет возраст этого файла и, если он моложе часа, получает результаты оттуда.В противном случае он снова заходит в твиттер.Вам нужно иметь файл, доступный для записи в папку / var / cache (создайте его, если его там нет).

Я вроде как взломал этот код вместе, поэтому дайте мне знать, если у вас возникнут какие-либо проблемыс этим.Он также использует функцию auto_link_twitter (), которая создает ссылки, необходимые в тексте Twitter.Я этого не писал, поэтому сейчас попробую найти ссылку на него.

Надеюсь, что все поможет,

T

ОБНОВЛЕНИЕ: Я не могу вспомнить, где я взял функцию 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;
}
0 голосов
/ 10 августа 2011

Вы можете использовать определенные методы 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');
        }
    }    
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...