Firefox XPCOM setTimeout问题

时间:2011-04-25 17:25:56

标签: javascript firefox firefox-addon

我正在编写一个简单的firefox扩展,它会抓取一堆网址并提取某些字段(所有被抓取的网址都会加载到用户的标签中)。

我面临的问题是在部分实际访问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();

    }

如何正确实现每5秒调用gotoURL的定时器功能?谢谢!

1 个答案:

答案 0 :(得分: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