1

像往常一样,我在 Google 上搜索了一下,并阅读了 Message Passing API,但是,我不得不再次求助于 StackOverflow 的好人。

我的问题是:在 Google Chrome 扩展程序的背景页面和内容脚本之间传递消息时,有没有办法让它异步 - 即延迟 JavaScript 直到检测到消息成功传递?

在消息传递函数使用传递的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"]等是不切实际的。另外,我什至不知道这是否可行。

有没有人有任何想法?

谢谢

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

4

2 回答 2

0

我不知道我是否解释错了你的问题。据我了解,您正在从扩展页面向内容脚本发送请求。内容处理程序中的请求处理程序对传递的消息执行一些操作,之后您需要将控制权返回到扩展页面。如果这是您需要的,您可以在Google 扩展文档中找到所有内容。以下代码有效

//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();
});
于 2012-05-09T09:34:05.673 回答
0

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

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

于 2012-05-15T19:19:29.333 回答