2017-09-20 55 views
0

我使用新的webextension標準構建Firefox擴展。javascript addEventListener和runtime.onMessage.addListener

當用戶點擊頁面上的任何位置時,我想讓點擊處於待機狀態幾毫秒,而另一個功能正在後臺腳本中執行任務。

這裏是我的代碼部分:

內容腳本:

var CanContinue = false; 
browser.runtime.onMessage.addListener(MsgListener); 

function MsgListener(request, sender, sendResponse) 
{ 
    if (request.msg == 'can_continue') 
     CanContinue = true; 
} 

function ClickDetected(event) 
{ 
    browser.runtime.sendMessage({"msg": "doWork"}); 
    while (! CanContinue); 
} 

window.addEventListener("click", function(event) { 
    ClickDetected(event); 
}, true); 

背景腳本:

browser.runtime.onMessage.addListener(MsgListener); 

function MsgListener(msg) 
{ 
    if (msg.msg == 'doWork') 
    { 
     ... 
     browser.tabs.sendMessage(TheTabId, {msg: 'can_continue'}); 
    } 
} 

的問題是,內容腳本不接收點擊事件未決時,can_continue消息,所以while (! CanContinue)從未發佈。

請注意,如果我測試它不在點擊事件過程中,則會正確接收消息。

回答

2

JavaScript是單線程的,消息傳遞是異步的。

while (! CanContinue);意味着全部您的代碼將只是掛起。答覆已準備就緒,正在坐在事件隊列中,但在當前代碼終止之前不會被處理。

你不能用這種方式「延遲」執行;你不能「等待」異步響應。

您可以嘗試通過取消事件並在確認後提出新事件來解決此問題。雖然我不確定它是否能夠在「用戶手勢」方面起作用。

+0

謝謝你,我會試試這種方式 – user3429139