Ajax длинная проблема опроса - PullRequest
0 голосов
/ 14 августа 2011

Я посмотрел краткое введение в длинный опрос ajax здесь и попытался имитировать его на своем компьютере с помощью wamp, однако я столкнулся с парой проблем.

Я продолжал получать сообщение об ошибке с неопределенным индексом в файле longpolling.php, строка 29, которая равна

$num = $_GET['num'];
Это произошло потому, что была одна функция get из ajax, у которой не было параметра num, в результате чего $ _GET notбыть установленнымЯ изменил код на
if(isset($_GET['num']))
    $num = $_GET['num'];
else
    $num = "";

, и это прекрасно работает.Однако, как только я перезагружаю страницу, счетчик компакт-дисков уменьшается один раз, а затем останавливается.

Кто-нибудь знает причину, почему это происходит?php-файл (сервер)

<?php

$cd_stock = ("CdCount.txt");

function updateStock($num)
{
    global $cd_stock;
    $count = file($cd_stock);
    $count = (int)$count[0];
    $count = $count - $num;
    if ($count < 0) $count = 0;
    $fp = fopen($cd_stock , "w");
    fputs($fp , "$count");
    fclose($fp);

    echo $count;
}

function getCdCount()
{
    srand();
    $newOrder  = rand(1, 3);
    $sleeptime = rand(2, 10);
    sleep(2);

    updateStock($newOrder);
}
if(isset($_GET['num']))
    $num = $_GET['num'];
else
    $num = "";
if ( $num = "")
{
    getCdCount();
}
else
{
    updateStock((int)$num);
}
?>

javascript-файл (клиент) (использует прототипную среду)

Event.observe(window, 'load', function() {

    Event.observe( 'btnSubmit', 'click', purchaseCD);

    connectToServer();
});

function connectToServer()
{
    new Ajax.Updater(  
        { success: 'CD Count', failure: 'errors' },
        'LongPolling.php', 
        {
            method:     'get',
            onSuccess:  function(transport)
            {
                if (parseInt(transport.responseText)) connectToServer();
            }
    });
}

function purchaseCD()
{
    new Ajax.Updater(
        { success: 'CD Count', failure: 'errors' },
        'LongPolling.php', 
        {
            method:     'get',
            parameters: { num: $('txtQty').getValue() }
    });
} 

html-файл не стоит публиковать.он просто включает в себя файл javascript ajax, файл js-прототипа и соответствующие файлы div и т. д.

Я часами ломал голову, пытаясь решить эту проблему, но понятия не имею, что не так, и это не так.обнадеживает то, что это исходит из статьи типа "учебник".

1 Ответ

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

Сам факт, что ваша первая проблема может существовать, - это учебник, прямо скажем, непростительный.Все учебные пособия должны работать с предположением, что у вас есть максимальное количество сообщений об ошибках (и было бы здорово, если бы все они рассказали вам, как убедиться, что это произошло).Хорошие новости для вас?WAMP по умолчанию устанавливает высокий уровень сообщений об ошибках, поэтому не стоит беспокоиться.

Я также не согласен с тем фактом, что он использует file таким образом (он должен использовать file_get_contents), и что он говорит вам использовать файл для начала - это должно быть $_SESSION или, что еще лучше, соединение с базой данных.Учебное пособие также должно избегать использования ключевого слова global всеми необходимыми средствами (и если учебное пособие не может справиться с этим, то, возможно, автору следует изучить учебные пособия, а не писать их).Он также считает, что для вас будет хорошей идеей использовать идентификатор, который является недействительным CSS (у вас не должно быть пробелов в ваших идентификаторах в CSS. Это допустимо в JS, но зачем вам это делать, если это делает CSS невозможным).Наконец, он рассказывает обо всех преимуществах Ajax.Updater, но решает использовать странную схему рекурсии вместо Ajax.PeriodicalUpdater . Вот для чего это.

Я рекомендую отказаться от этого учебника и поработать над лучшим.Лично я нахожу ценность в изучении «старых путей» (без фреймворка AJAX), я должен рекомендовать этот .Если вы хотите использовать фреймворк, лично я думаю, что вам лучше использовать учебник по jQuery (например, этот ), поскольку он гораздо более распространен.Если вам действительно нравится Prototype, есть и другие, более простые примеры - этот кажется очень прямым.

Если вы чувствуете, что это единственный настоящий учебник, прежде всего, тоЕсть некоторые вещи, которые вы можете сделать, чтобы помочь себе разобраться в этом.У вас нет явных ошибок в кодировании, поэтому самое большее, что я могу сделать, это дать вам совет:

  1. Убедитесь, что WAMP все еще работает (глупый шаг, я знаю, но это случается с довольно многимииз нас иногда).
  2. Заменить "sleep" в PHP на if (parseInt(transport.responseText)) setTimeout(connectToServer, Math.rand() * 4000 + 1000); (помещает задержку на стороне клиента вместо стороны сервера).sleep реально следует использовать только в чрезвычайно редких случаях.
  3. Позвоните console.log (или предупредите, если вы не используете инструмент веб-разработчика, такой как Firebug (и если нет ... почему бы и нет?))на transport.responseText.Если сервер возвращает 0, он не будет запускать метод connectToServer снова.Поэтому знание того, что это значение может быть полезным.
  4. Отслеживание запросов Ajax.Вы можете сделать это с Firebug бесплатно.
  5. Посмотрите на CdCount.txt, посмотрите, обновляется ли он вообще.
...