延迟脚本直到所有消息都已通过?

时间:2012-05-08 20:08:40

标签: javascript google-chrome message

像往常一样,我已经谷歌搜索了一下,并阅读了Message Passing API,但是,再次,我不得不求助于StackOverflow的好伙伴。

我的问题是:在谷歌浏览器扩展程序的后台页面和内容脚本之间传递消息时,是否有任何方法可以使其异步 - 也就是说,延迟JavaScript直到检测到消息成功传递? / p>

在消息传递函数使用传递的localStorage数据后,我立即有了一个函数。在第一次运行时,由于数据传输速度不够快,脚本总是会导致错误。

目前,我正在用setTimeout(nextFunction, 250);来规避这一点,但这不是一个优雅或实用的解决方案,因为传递的值的数量和大小总是会改变,我无法知道它需要多长时间传递价值观。另外,我想,传递时间与浏览器版本和用户系统有关。

简而言之,我需要它是动态的。

我考虑过像

这样的事情
function passMessages(){
    chrome.extension.sendRequest({method: "methodName"}, function(response) {
        localStorage["lsName"] = response.data;
    });

    checkPassedMessages();
}

function checkPassedMessages(){
    if (!localStorage["lsName"]){
        setTimeout(checkPassedMessages, 100); //Recheck until data exists
    } else {
         continueOn();
    }
}

但我需要传递相当多的数据(至少20个值),坦率地说,这对!localStorage["lsName1"] && !localStorage["lsName2"]等等是不切实际的。另外,我甚至不知道这是否有用。< / p>

有没有人有任何想法?

由于

更新:遗憾的是,仍然没有回答。任何人都可以提供任何帮助吗? :/

2 个答案:

答案 0 :(得分:0)

我不知道我是否错误地解释了你的问题。据我所知,您正在从扩展页面向内容脚本发送请求。内容处理程序中的请求处理程序对传递的消息执行一些操作,之后您需要在扩展页面中返回控件。如果这是您所需要的,那么您可以拥有Google Extension Documentation中的所有内容。以下代码可以使用

//Passing the message
function passMessages(){
  chrome.extension.sendRequest({method: "methodName"}, function(response) {
    //callback function that will be called from the receiving end

    continueOn();
  });
}

//Recieving the message
chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {
     //Do the required operation with the message passed and call sendResponse

     sendResponse();
});

答案 1 :(得分:0)

您可以通过收集传递的信息解决此问题的一般情况(即,在您执行不同执行线程的任何平台上),同时在开始处理之前等待某些后续“go”消息收集的信息。您可以使用相同的想法让发件人等待完整的回复。

当然,您的特定平台可能会提供执行此操作的工具;但如果没有,您可以随时手动构建通用解决方案。