2013-07-26 77 views
0

我只是好奇,如果可以在Firefox插件中調用一個函數,該函數將等待異步函數調用中的回調。它可能是有用的。Firefox插件:將異步轉換爲異步

例如

function async_func(callback) { 
    ... 
    callback(2); 
} 

function callback_foo(x) { return x*x; } 
var results = Sync.wait_for_async_callback(async_func, callback_foo); 
// now, results is 2*2 = 4 
.... 

我知道JavaScript引擎是一般一個線程,所以它不能同時運行同步的等待,在Sync.wait_for_async_callback睡覺,調用async_func或功能回調從async_func調用。

但我偶然發現this article可能表明它有可能。但是我找不到這個需要的模塊(一個Sync.js文件)。該文章上的Link似乎沒有用(服務器端代碼中的錯誤?)Mozilla-central上的Firefox代碼不知道此文件。

也許Web Workers或nsIThreadManager可能是將異步轉換爲同步呼叫的其他方式。

+0

你爲什麼不只是使用一個回調? –

+0

@AdrianLang 我知道回調一般是很好的解決方案,因爲不會凍結一個線程,但例如回調函數中需要返回值時不能使用。更大的問題是當某些東西不支持異步功能時,只會同步。 例如,Bookmark Favicon Change的擴展名爲[broken](https://bugzilla.mozilla.org/show_bug.cgi?id=834457#c17),因爲它需要重寫同步的內部Firefox功能,Mozilla刪除了一些同步功能。需要返回值不能在回調中返回。 – Greck

回答

1

所以我找到了Sync.js module。它採用synchrounous等待由processNextEvent下一個事件,直到回調將被解僱:

let thread = Cc["@mozilla.org/thread-manager;1"].getService().currentThread; 
while (async callback not fired yet) 
    thread.processNextEvent(true); 

這一招似乎工作,但根據馬可Bonardo it is bad choice(崩潰?)

+0

關於使用自旋事件循環的一些注意事項:來自[MDN](https://developer.mozilla.org/en-US/docs/Code_snippets/Threads#Waiting_for_a_background_task_to_complete),作者:[Andrew Sutherland](https://bugzilla.mozilla .ORG/show_bug.cgi?ID = 608095#C0) – Greck