Проблема с отключением Firefox XPCOM

#javascript #firefox #firefox-addon

#javascript #firefox #firefox-дополнение

Вопрос:

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

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

Я попробовал два метода, перечисленных здесь http://groups.google.com/group/mozilla.dev.extensions/browse_thread/thread/de47c3949542b759 но безрезультатно. Использование обоих компонентов.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:

Ну, 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 .

Комментарии:

1. Вау, ты быстрый! Это сработало как по волшебству. Большое вам спасибо!