Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google chrome addListener';从回调调用的sendResponse返回上一条消息_Google Chrome_Google Chrome Extension_Webkit - Fatal编程技术网

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
    变量将填充所需的值。但是会很晚,因为你已经发送了回复
  • 下一次传递消息时,您将收到以前的主题值(第2点),因为只有在您发送该值后,代码才会找到新的值

    一种解决方案可能是在找到所需值后,在
    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
    变量将填充所需的值。但是会很晚,因为你已经发送了回复
  • 下一次传递消息时,您将收到以前的主题值(第2点),因为只有在您发送该值后,代码才会找到新的值

    一种解决方案可能是在找到所需值后,在
    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想要的……您所说的“它返回上一个文件”是什么意思?