window.setInterval изнутри объекта - PullRequest
0 голосов
/ 19 мая 2010

У меня сейчас проблема с тем, что у меня есть объект javascript, который пытается использовать setInterval для вызова частной функции внутри себя. Тем не менее, он не может найти объект, когда я пытаюсь вызвать его. У меня такое ощущение, что это потому, что window.setInterval пытается вызвать объект извне, но не имеет ссылки на объект. FWIW - я не могу заставить его работать с публичной функцией.

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

Следующий код предназначен для непрерывной проверки связи с веб-службой для получения статуса загрузки моего файла:

var FileUploader = function(uploadKey) {
    var intervalId;

    var UpdateProgress = function() {
        $.get('someWebService', {},
        function(json) {
            alert('success');
        });
    };

    return {
        BeginTrackProgress: function() {
            intervalId = window.setInterval('UpdateProgress()', 1500);
        },

        EndTrackProgress: function() {
            clearInterval(intervalId);
        }
    };
};

Вот как это называется:

var fileUploader = new FileUploader('myFileKey');
fileUploader.BeginTrackProgress();

Ответы [ 3 ]

8 голосов
/ 19 мая 2010

Используйте это

 intervalId = window.setInterval(UpdateProgress, 1500);

setInterval с буквальным аргументом eval это в глобальной области, где UpdateProgress недоступен.

2 голосов
/ 19 мая 2010

Поскольку это выражение eval, у него нет доступа к области, в которой создан setInterval. Попробуйте:

intervalId = window.setInterval(UpdateProgress, 1500)

Как правило, по возможности избегайте выражений стиля eval. Например, если вы хотите вызвать несколько функций из одного таймера, вы должны использовать анонимную функцию вместо строки.

window.setInterval(function () {
    function1();
    function2();
}, 1500)

Смотри также

0 голосов
/ 19 мая 2010

+ 1 к голове Энди Э (пока не могу голосовать, дох!)

Еще один недостаток, который может вам помочь, это если вы используете this из вызываемой функции.

Тогда выполнение именно того, что есть у Энди с этим дополнением, поможет вам.

var that = this;
window.setInterval(function() {
    function1.apply(that);
    function2.apply(that);
}, 1500);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...