2014-11-24 43 views
0

我在後臺爬行大約20個網站,當頁面加載時,在頁面工作者的插件腳本。不幸的是瀏覽器在此期間凍結,無法預知。firefox addon sdk頁面工作者塊主線程

我試圖用timers.setTimeout(...,0-400ms),並還試圖從維基

function executeSoon(aFunc) { 
    var tm = Cc["@mozilla.org/thread-manager;1"] 
     .getService(Ci.nsIThreadManager); 

    tm.mainThread.dispatch({ 
     run: function() { 
      aFunc(); 
     } 
    }, Ci.nsIThread.DISPATCH_NORMAL); 
} 

的例子,但是這也凍結UI。還有其他解決方案嗎?

抓取代碼:

... 
timer.setTimeout(function() { 
    let pageWorker = require("sdk/page-worker").Page({ 
     contentScriptFile: self.data.url("js/extractor.js"), 
      contentURL:  url 
    }); 

    pageWorker.port.on("loaded", function (content) { 
     if (typeof callback === 'function') { 
      callback(content); 
     } 
    }); 
}, 200) 
... 

的extractor.js,即使在簡單的情況下,當它返回body.textContent,阻塞。

+0

如果您發佈我們可以幫助您,您嘗試運行的抓取代碼是什麼。 – Noitidart 2014-11-24 04:32:37

+0

@Noitidart我加了代碼,沒什麼特別的。 – Sam 2014-11-24 04:46:19

+0

js/extractor.js中有什麼?這是鎖定它的代碼,你在那裏的代碼不會鎖定任何東西。 – Noitidart 2014-11-24 15:56:29

回答

0

頁面工作者API只是創建一個不可見的頁面,它不會在後臺線程上這樣做,因爲它必須創建一個完整的窗口/文檔環境,包括佈局以允許完整的dom /樣式功能和佈局始終發生主線程。

如果您想在後臺進行計算,您應該使用Worker或ChromeWorker API,其中您將無法訪問DOM和許多其他API。

在SDK,可以用

const { ChromeWorker } = require("chrome"); 
+0

由於我無法使用後臺處理DOM API,我選擇使用net/url的readURI函數來接收原始HTML。這當然不理想,但要快得多。從插件腳本中使用worker/ChromeWorker API的地方是否有良好的文檔?我找不到任何好東西。 – Sam 2014-11-24 18:40:08

+0

更新了我的回答 – the8472 2014-11-24 21:37:44

0

這是因爲Firefox使用主線程的頁面工人,在Firefox夜間內容頁使用獨立的進程,這意味着頁面工人將使用一個單獨的進程所以,給Firefox Nightly一試,它應該在那裏工作,這將在幾個月內發佈。

+0

這將是安靜真棒,感謝提示。有沒有發佈說明,你可以參考? – Sam 2014-11-26 22:10:21

相關問題