2011-04-25 78 views
0

我正在写一个简单的firefox扩展,它抓取一堆url并提取某些字段(所有被抓取的url将被加载到用户的标签中)。Firefox XPCOM setTimeout问题

我面临的问题是部分实际访问URL并加载页面。我希望每个页面都在固定的时间段内加载。例如,每5秒钟访问每个站点。

我尝试了这里列出的两种方法http://groups.google.com/group/mozilla.dev.extensions/browse_thread/thread/de47c3949542b759但无济于事。使用Components.classes [“@ mozilla.org/appshell/appShellService;1”]和nsITimer。该while循环立即执行和如何实现能正确调用gotoURL每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秒钟后)?谢谢!

回答

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

+0

哇,你快!它像一个魅力。非常感谢你! – netvarun 2011-04-25 18:27:40

+0

@ user649851:不客气:) – 2011-04-25 18:32:56