Google chrome addListener';从回调调用的sendResponse返回上一条消息
一开始我以为问题出在Google chrome addListener';从回调调用的sendResponse返回上一条消息,google-chrome,google-chrome-extension,webkit,Google Chrome,Google Chrome Extension,Webkit,一开始我以为问题出在chrome.runtime.sendMessage()我发送了两条消息。一个用于访问localstorage,另一个用于获取/读取文件数据,但在我将它们合并到一个sendMessage中后,没有任何更改,这意味着实际问题是window.webkitRequestFileSystem()它返回的是上一个文件,而不是当前文件 是否有更好/更快的方式在客户端存储内容?(我愿意尝试一切) manifest.json { "manifest_version": 2, ...
chrome.runtime.sendMessage()
我发送了两条消息。一个用于访问localstorage
,另一个用于获取/读取文件数据,但在我将它们合并到一个sendMessage
中后,没有任何更改,这意味着实际问题是window.webkitRequestFileSystem()
它返回的是上一个文件,而不是当前文件
是否有更好/更快的方式在客户端存储内容?(我愿意尝试一切)
manifest.json
{
"manifest_version": 2,
...
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": ["content.js"],
"run_at": "document_end"
}
],
"background": {
"scripts": ["background.js"]
},
"permissions": [
"unlimitedStorage"
]
}
background.js
var theme = '';
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if(request.method == "getTheme") {
themes = JSON.parse(localStorage["themes"]);
themeName = "";
for (var i = themes.length - 1; i >= 0; i--) {
if(request.url.indexOf(themes[i]) !== -1) {
themeName = themes[i];
}
};
window.webkitRequestFileSystem(window.PERSISTENT, 0, readFromFileStorage.bind(window, themeName), errorHandler);
sendResponse({data: theme});
}
});
function readFromFileStorage(filename, fs) {
fs.root.getFile(filename, {}, function(fileEntry) {
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function(e) {
theme = this.result;
};
reader.readAsText(file);
}, errorHandler);
}, errorHandler);
}
function errorHandler(e) {
console.log('Error: ' + e.message);
}
content.js
chrome.runtime.sendMessage({method: "getTheme", url: location.href}, function(response) {
console.log(response.data);
});
因为你的问题不是一个简单的问题,所以很难测试它,但我认为你的问题是理解JS异步的本质 因此,您的代码将如何实际执行:
window.webkitRequestFileSystem(PERSISTENT,0,successCallback,errorHandler)代码>将被执行
sendResponse({data:theme})
将发送包含主题中存储内容的响应
successCallback
或errorHandler
。如果将调用successCallback
,则您的theme
变量将填充所需的值。但是会很晚,因为你已经发送了回复successCallback
内部调用sendsresponse
(您必须将sendsponse
传递到readFromFileStorage
)。如果您这样做,您可以考虑将<代码> SeNeRebug <代码>添加到<代码> Error Healths函数中,以确保您的代码将始终得到有效的响应。
如果将
sendResponse
移动到回调中,则必须从addListener
函数返回true,否则addListener
上的返回通道将关闭,响应将不会发送。由于您的问题不是一个问题,因此很难测试它,但我认为你的问题在于理解JS异步的本质
因此,您的代码将如何实际执行:
window.webkitRequestFileSystem(PERSISTENT,0,successCallback,errorHandler)代码>将被执行
sendResponse({data:theme})
将发送包含主题中存储内容的响应
successCallback
或errorHandler
。如果将调用successCallback
,则您的theme
变量将填充所需的值。但是会很晚,因为你已经发送了回复successCallback
内部调用sendsresponse
(您必须将sendsponse
传递到readFromFileStorage
)。如果您这样做,您可以考虑将<代码> SeNeRebug <代码>添加到<代码> Error Healths函数中,以确保您的代码将始终得到有效的响应。
如果将
sendResponse
移动到回调中,则必须从addListener
函数返回true,否则addListener
上的返回通道将关闭,响应将不会发送。再次:不要使用chrome.extension.onMessage/sendMessage。改用chrome.runtime.*吧!顺便说一句,什么是files
是file=files[i]
?你是说themes[i]
?在background.js
片段的第7行中,数据是什么?真是一团糟!请发布实际代码或.Hi,您实际上可以通过选项卡对象在background.js中获取url。您可以从内容脚本中获取localStorage,通过chrome.storage.local获取扩展存储,或通过localStorage获取页面存储。@YoArgentino:您提到的是非常正确的,但(在大多数情况下)这并不是OP想要的……您所说的“它返回上一个文件”是什么意思?再一次:不要使用chrome.extension.onMessage/sendMessage。改用chrome.runtime.*吧!顺便说一句,什么是files
是file=files[i]
?你是说themes[i]
?在background.js
片段的第7行中,数据是什么?真是一团糟!请发布实际代码或.Hi,您实际上可以通过选项卡对象在background.js中获取url。您可以从内容脚本中获取localStorage,通过chrome.storage.local获取扩展存储,或通过localStorage获取页面存储。@YoArgentino:您提到的是非常正确的,但(在大多数情况下)这并不是OP想要的……您所说的“它返回上一个文件”是什么意思?