#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. Вау, ты быстрый! Это сработало как по волшебству. Большое вам спасибо!