Область применения Javascript - PullRequest
2 голосов
/ 02 марта 2011

У меня проблемы с тем, что глобальная переменная javascript (называемая TimeStamp) не определяется при загрузке ... по крайней мере, я думаю, что в этом проблема.

Я начинаю с этого, определяя TimeStamp.

*Затем 1004 *

... waitForMsg запускается с использованием TimeStamp и обновляет его при успешном завершении вызова ajax.По крайней мере, это идея, но на данный момент ничего не работает, потому что «TimeStamp не определен» ... хотя я определил это ранее!(urgh).

Если я переопределю метку времени в waitForMsg, он просто будет сброшен вместо использования обновленного значения из успешной функции ajax.

    function waitForMsg(){


    $.ajax({
        type: "POST",
        url: "backend.php",
        async: true,
        cache: false,
        timeout:50000, /* Timeout in ms */
        data: "TimeStamp=" + TimeStamp,
        success: function(data){

            var json = eval('(' + data + ')');

            $('#TextHistory :last-child').after('<p>' + json['msg'] + '</p>');


            TimeStamp = json['timestamp'];


            setTimeout(
                'waitForMsg()', /* Request next message */
                1000            /* ..after 1 seconds */
            );
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){

            $('#TextHistory :last-child').after('<p>' + errorThrown + '</p>');

            setTimeout(
                'waitForMsg()', /* Try again after.. */
                "15000");       /* milliseconds (15seconds) */
        },
    });
};

Как всегда, любая помощь очень ценится.

Дан.

Ответы [ 3 ]

2 голосов
/ 02 марта 2011

изменить

$(document).ready(function(){
    // AddTest();
    var TimeStamp = null;
    waitForMsg();
});

на

var TimeStamp = null;
$(document).ready(function(){
    // AddTest();
    waitForMsg();
});

Таким образом, он будет жить в глобальной области, а не только в области функции готовности.

В качестве дальнейшего примечания вы должны изменить свои setTimeout заявления с формы setTimeout(string to eval,delay) на setTimeout(function reference to run, delay).например:

setTimeout(waitForMsg,1000);

, чтобы избежать ненужного вызова eval.

Более того, рассмотрите возможность изменения

var json = eval('(' + data + ')');

на

var json = JSON && JSON.parse ? JSON.parse(data) : eval('(' + data + ')');

, чтобы вы могли воспользоваться преимуществами собственного анализа JSON в современных браузерах.

Еще лучше, если jQuery десериализует JSON для вас, добавив dataType: 'json' в качестве параметра при вызове ajax:)

0 голосов
/ 02 марта 2011

Вы должны определить var TimeStamp вне любых функций в области видимости страницы.

Когда вы определяете переменную в блоке кода, она будет видна только на том же «уровне» и не будет видна в методах, которые вы вызываете из этого блока кода.

Когда вы записываете значения в переменную TimeStamp в вашем вызове ajax (и не определяете ее с помощью 'var'), она автоматически определяет или повторно использует переменную TimeStamp в области видимости страницы, однако, поскольку вы пытаетесь прочитать TimeStamp (data : Переменная "TimeStamp =" + TimeStamp), прежде чем вы даже запишите ее, она сгенерирует ошибку «не определено».

В любом случае: рассмотрите возможность избежать использования переменных области видимости.

0 голосов
/ 02 марта 2011

Не пропускайте строки, чтобы избежать.Это неэффективно, трудно отлаживать и нарушает область действия:

setTimeout('waitForMsg()',1000);

Делать функции передачи:

setTimeout(waitForMsg,1000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...