像往常一样,我已经谷歌搜索了一下,并阅读了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>
有没有人有任何想法?
由于
更新:遗憾的是,仍然没有回答。任何人都可以提供任何帮助吗? :/
答案 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”消息收集的信息。您可以使用相同的想法让发件人等待完整的回复。
当然,您的特定平台可能会提供执行此操作的工具;但如果没有,您可以随时手动构建通用解决方案。