Firefox XPCOM setTimeout проблема - PullRequest
       4

Firefox XPCOM setTimeout проблема

0 голосов
/ 25 апреля 2011

Я пишу простые расширения Firefox, которые сканируют кучу URL-адресов и извлекают определенные поля (все просматриваемые URL-адреса будут загружены на вкладку пользователя).

Проблема, с которой я сталкиваюсь, заключается в том, что часть посещает URL и загружает страницу. Я хочу, чтобы каждая страница загружалась с фиксированным таймером. Например, каждый сайт должен посещаться каждые 5 секунд.

Я попробовал два метода, перечисленных здесь http://groups.google.com/group/mozilla.dev.extensions/browse_thread/thread/de47c3949542b759, но безрезультатно. Использование обоих Components.classes ["@ mozilla.org/appshell/appShellService;1"], а также nsITimer. Циклы while выполняются немедленно, а страницы загружаются позже (через 5 секунд подряд)

 function startCrawl()
    {
        while(urlq.length>0)
        {
            var currentUrl = urlq.shift();
            urlhash[currentUrl]=1;

            if(currentUrl!=undefined)
            {
                setTimeout(gotoURL,5000,currentUrl);
            }

        }
            start=0;
            alert('crawl stopped');

            for(var k in foundData)
            {
                alert('found: ' + k);
            }           

    }

    function gotoURL(gUrl)
    {
        mainWindow.content.wrappedJSObject.location=gUrl;
        extractContent();

    }

Как мне реализовать функцию таймера, которая правильно вызывает gotoURL каждые 5 секунд? Спасибо!

1 Ответ

1 голос
/ 25 апреля 2011

Ну, setTimeout выполняется асинхронно. Цикл не ждет, пока функция не будет вызвана. Вы должны изменить стратегию (если я вас правильно понял).

Например, вы можете вызвать следующее setTimeout после извлечения информации:

function startCrawl() {
    function next() {
        var currentUrl = urlq.shift();
        if(currentUrl) {
            setTimeout(gotoURL,5000,currentUrl, next);
        }
    }
    next();    
}

function gotoURL(gUrl, next) {
    mainWindow.content.wrappedJSObject.location=gUrl;
    extractContent();
    next();
}

И да, лучше использовать nsITimer.

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