Быть перенаправленным в неправильное место - иногда - PullRequest
2 голосов
/ 25 июня 2009

У меня есть javascript setInterval, который проверяет внешнюю страницу каждые 5 секунд на наличие почты, иногда я обнаруживаю, что, если я вхожу в систему или нажимаю на форму, отправляемую одновременно с отправкой запроса, иногда я вижу, что или N (что должен был перехватить мой JS) вместо реальной ссылки, на которую я хотел перейти.

Как можно это отладить? Я использую Firefox с Firebug, мое приложение использует PHP с JavaScript.

РЕДАКТИРОВАТЬ: это почти как если бы onComplete пропустил Java, и он просто сбрасывает его, когда пользователь входит в систему .... это происходит только тогда, когда кто-то меняет страницы и одновременно запускается Java.

РЕДАКТИРОВАТЬ 2: Если вы хотите убедиться в этом сами, вам нужно посетить мой сайт и создать учетную запись и пройти процедуру регистрации (2-3 минуты, чтобы сделать топы), веб-сайт http://mikesandmegs.com, а бета-пароль goldfish . То, что вы хотите сделать, это войти в систему так же, как чек по почте отправляет свой запрос. Как будто мне нужно что-то отменить или сказать java, чтобы он выбрасывал обратный вызов или что-то в этом роде. Вы должны видеть запросы каждые 5 секунд (ну, это добавляет 5 секунд каждый запрос), но вы увидите. Это может занять пару попыток или удачу, но это воспроизводимо.

Это javascript, который работает (я думаю, что я все это опубликовал) Если мне кажется, что я что-то упустил, дайте мне знать. Я также разместил htnl входной html, который проверяет javascript ...

<input id="hasMail" type="hidden" value="y">

<script type='text/javascript'>
    mailTimer = setInterval("checkMail();", 10000);

function checkMail()
{
    // should we check the mail now?
    if ($('hasMail').value == "y")
    {
        // remove mail new mail alert (mail-check.php returns y or n
        new Ajax.Request('mail-check.php', 
        { 
            method: 'post', 
            postBody: '',
            onComplete: checkMailNotify 
        });
    }
}

    function checkMailNotify(req)
    {
        if (req.responseText.length > 5)
        {
            $('hasMail').value = "n";
            clearInterval (mailTimer);
            return;
        }

        if (req.responseText == "y")
        {
            $('hasMail').value = "n";
            $('topMessage').update('<a href="/mail-inbox.php">You have new mail...</a>');
            $('alertBox').appear();
            clearInterval (mailTimer);
        }
        else
        {
            clearInterval (mailTimer);
            mailInterval = mailInterval + 5000;
            mailTimer = setInterval("checkMail();", mailInterval);
        }
    }

</script>

Ответы [ 2 ]

1 голос
/ 25 июня 2009

Я знаю, что это далеко не решение, но оно поможет увеличить 5-секундный интервал, даже до 30 секунд. Я уже работал с почтовыми серверами, и мы часто сталкивались с проблемами, когда люди, например, могли бы, например, на своем iphone, а также на своем настольном почтовом клиенте пинговать сервер через очень короткие промежутки времени. Это приведет к путанице (для них) сбоев из-за блокировок.

Так что да, 5 секунд для сообщений - это очень быстро (это не похоже на чат, а просто на сообщения, верно?). В лучшем случае, если вы сделаете это, тогда проблема случится намного реже, если все это будет. Однако у вас будет ужасное знание, что это может произойти.

Пожалуйста, не воспринимайте это как попытку решения вашей проблемы. просто предложение.

0 голосов
/ 25 июня 2009

Я думаю, что при смене страниц данные из mail-check.php конфликтуют с новым запросом, который возвращается из сети одновременно. Я думаю, что возможное решение - отключить setInterval всякий раз, когда вы меняете страницу или отправляете форму, а затем повторно включаете ее после загрузки новых данных.

Что-то вроде:

<input type="button" onClick="clearInterval('mailTimer'); this.submit()" />
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...