javascript addEventListener和runtime.onMessage.addListener

javascript addEventListener和runtime.onMessage.addListener,javascript,firefox-addon-webextensions,Javascript,Firefox Addon Webextensions,我正在使用新的webextension标准构建Firefox扩展 当用户单击页面上的任意位置时,我希望在另一个函数在后台脚本中执行任务时,将单击置于待机状态几毫秒 以下是我的部分代码: 内容脚本: var CanContinue = false; browser.runtime.onMessage.addListener(MsgListener); function MsgListener(request, sender, sendResponse) { if (request.msg

我正在使用新的webextension标准构建Firefox扩展

当用户单击页面上的任意位置时,我希望在另一个函数在后台脚本中执行任务时,将单击置于待机状态几毫秒

以下是我的部分代码:

内容脚本:

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'});  
    }
}
背景脚本:

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'});  
    }
}
问题是,内容脚本在click事件挂起时未接收到
可以继续
消息,因此
while(!CanContinue)
永远不会释放


请注意,如果我在单击事件过程之外对消息进行测试,则会正确接收消息。

JavaScript是单线程的,消息传递是异步的

while(!CanContinue)表示所有代码都将挂起。回复已准备就绪,并且位于事件队列中,但在当前代码终止之前不会进行处理

你不能以这种方式“延迟”执行;您不能“等待”异步响应


您可以尝试通过取消事件,然后在得到确认后引发一个新事件来解决此问题。不过,我不确定它在“用户手势”方面是否有效。

JavaScript是单线程的,消息传递是异步的

while(!CanContinue)表示所有代码都将挂起。回复已准备就绪,并且位于事件队列中,但在当前代码终止之前不会进行处理

你不能以这种方式“延迟”执行;您不能“等待”异步响应


您可以尝试通过取消事件,然后在得到确认后引发一个新事件来解决此问题。不过,我不确定它在“用户手势”方面是否有效。

谢谢你,我会尝试这种方式谢谢你,我会尝试这种方式