2011-10-04 20 views
3

如何修改以下代碼以同步方式運行? AddonManager是一個異步調用,我無法獲得正確的結果。如何解決使用Javascript中的異步?

function initWithPrivs (java, ext_id, jarFiles) { 

    var [loader, urls] = init(java, ext_id, jarFiles); 
    policyAdd(loader, urls); 
    return [loader, urls]; 
} 

function init (java, ext_id, jarFiles) { 

var classLoader; 
var fURLs=[]; 
    JAVA = java; 
    try { 

     Components.utils.import("resource://gre/modules/AddonManager.jsm"); 
AddonManager.getAddonByID("[email protected]",function(addon) { 

    //Some code to process fURLs and classLoader 
    //If i put return here its shows me error 
} 
); 
    return [classLoader,fURLs]; //If i use return here it return null. 
} 
catch(Exception e) 
{ 
} 
+4

你不應該。這是異步的,因爲磁盤訪問需要時間。你可以稍微簡化使用生成器的異步代碼,但對於簡單的情況來說這不值得。 –

+1

這是異步的,以加快在瀏覽器中加載頁面的速度。如果你的目標是「最小化加載速度」,那麼使這個同步似乎是一個很好的計劃,否則,不是那麼多。 – DwB

+0

這似乎相當愚蠢,迫使一切都異步。結果是,你反覆調用這個過於抽象和臃腫的接口,一遍又一遍地完成同一任務的微小部分,而不是一次完成,然後使用相同的對象。我只是想檢索整個插件對象JUST ONCE,以便在十幾個訪問不同屬性的地方使用。在這個用例中,異步如何幫助任何人?由於冗餘調用和內存泄漏以及數量級更復雜的臃腫代碼而浪費了「節省的」微不足道的時間。 – user314159

回答

1

您不應該使該代碼同步,使用異步方法。

所以,我不建議這樣做,但我無論如何會提到它,你可以這樣做:

var addonObj = null; 
AddonManager.getAddonByID("[email protected]",function(addon) { 
    addonObj = addon; 
}); 
var thread = Cc["@mozilla.org/thread-manager;1"].getService().currentThread; 
while (addonObj == null) 
    thread.processNextEvent(true); 
// addonObj is no longer null... 
1

,豈不是更好地做到:

var addonObj = -1; 
AddonManager.getAddonByID("[email protected]",function(addon) { 
    addonObj = addon; 
}); 
var thread = Components.classes["@mozilla.org/thread-manager;1"].getService().currentThread; 
while (addonObj != null || addonObj == -1) 
    thread.processNextEvent(true); 
// addonObj is no longer null... 

在沒有安裝Addon的情況?

+0

如果我在我自己的插件中使用它,我可以合理地確定它已安裝,所以其他用法可能就足夠了。如果沒有,那麼其他的東西就會被破壞,我可能需要擦洗配置文件來修復它。如果我在圍繞其他人的插件,並且詢問可能安裝或未安裝的東西,那麼這種替代方法似乎可以防止無限循環。 – user314159