Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/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
Javascript Chrome扩展|有没有办法让Chrome.storage.local.get()返回一些东西?_Javascript_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript Chrome扩展|有没有办法让Chrome.storage.local.get()返回一些东西?

Javascript Chrome扩展|有没有办法让Chrome.storage.local.get()返回一些东西?,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,在我的chrome扩展中,我需要使用chrome存储。在我的后台脚本中,我首先创建一个对象并将其添加到chrome存储中,然后我想从那里获取我的对象并将其返回。诸如此类: ... var obj = {}; chrome.storage.local.set(obj, function () { }); ... var data = getData(obj); // I want my object to be returned here var returnedData = null; fun

在我的chrome扩展中,我需要使用chrome存储。在我的后台脚本中,我首先创建一个对象并将其添加到chrome存储中,然后我想从那里获取我的对象并将其返回。诸如此类:

...
var obj = {};
chrome.storage.local.set(obj, function () { });
...
var data = getData(obj); // I want my object to be returned here

var returnedData = null;
function getData(obj) {
    chrome.storage.local.get(obj, function(result) {
        returnedData = result; // here it works, I can do something with my object
    });
    return returnedData; // here it doesn't work
} 
var returnedData = null;
function setData(value) {
 returnedData = value;
}
function getData(obj) {
    chrome.storage.local.get(obj, function(result) {
        setData(result); // here it works, I can do something with my object
    });
    return; // here it doesn't work
} 
据我从
chrome.storage.local.get中了解,chrome.storage.local.get
是异步的,其后果是。但是,有没有办法从chrome存储中获取一些东西并将其退回呢?我的意思是也许我应该在另一个函数中包装chrome.storage.local.get


非常感谢

你必须这样做:

...
var obj = {};
chrome.storage.local.set(obj, function () { });
...
var data = getData(obj); // I want my object to be returned here

var returnedData = null;
function getData(obj) {
    chrome.storage.local.get(obj, function(result) {
        returnedData = result; // here it works, I can do something with my object
    });
    return returnedData; // here it doesn't work
} 
var returnedData = null;
function setData(value) {
 returnedData = value;
}
function getData(obj) {
    chrome.storage.local.get(obj, function(result) {
        setData(result); // here it works, I can do something with my object
    });
    return; // here it doesn't work
} 
…因为您试图返回一个尚未从存储中读取的值,所以它为空。

不,这是不可能的

但是有几种方法可以解决这个问题

  • 在回调内部对从
    .get()
    返回的数据执行所有操作(或使用函数调用从那里启动)。这是@wernersbacher发布的内容
  • 看看延迟(jQuery或Q库)。延迟的承诺可以从getData返回。在
    .get()
    回调中,您可以解析延迟。在getData之外,您可以使用
    .then()
    在延迟解析后执行某些操作
  • 像这样的

    function getData(obj) {
        var deferred = $.Deferred();
        chrome.storage.local.get(obj, function(result) {
           deferred.resolve(result);
        });
        return deferred.promise();
    }
    
    $.when(getData(obj)).then(function(data) {
       // data has value of result now
    };
    

    您需要使用回调函数来处理它。这里有两个例子。您可以使用单个函数进行设置,但是可以为每个“完成时”创建单独的函数。您可以很容易地修改回调函数,以便始终传递附加参数以执行所需的任务

    function setLocalStorage(key, val) {
        var obj = {};
        obj[key] = val;
        chrome.storage.local.set(obj, function() {
            console.log('Set: '+key+'='+obj[key]);
        });
    }
    
    function getLocalStorage(key, callback) {
        chrome.storage.local.get(key, function(items) {
            callback(key, items[key]);
        });
    }
    
    setLocalStorage('myFirstKeyName', 'My Keys Value Is FIRST!');
    setLocalStorage('mySecondKeyName', 'My Keys Value Is SECOND!');
    
    getLocalStorage('myFirstKeyName', CallbackA);
    getLocalStorage('mySecondKeyName', CallbackB);
    
    
    // Here are a couple example callback 
    // functions that get executed on the 
    // key/val being retrieved. 
    
    function CallbackA(key, val) {
        console.log('Fired In CallbackA: '+key+'='+val);
    }
    
    function CallbackB(key, val) {
        console.log('Fired In CallbackA: '+key+'='+val);
    }
    

    如果您不想使用全局变量,并且对现代浏览器的要求也很满意,那么您可以实现一个本地JavaScript。例如,下面是一个函数,它返回单个给定键的存储数据:

    function getData(sKey) {
      return new Promise(function(resolve, reject) {
        chrome.storage.local.get(sKey, function(items) {
          if (chrome.runtime.lastError) {
            console.error(chrome.runtime.lastError.message);
            reject(chrome.runtime.lastError.message);
          } else {
            resolve(items[sKey]);
          }
        });
      });
    }
    
    // Sample usage given this data:
    // { foo: 'bar' }
    getData('foo').then(function(item) {
      // Returns "bar"
      console.log(item);
    });
    

    如果您需要对IE11及以下版本的支持,那么您将不得不求助于类似的库。

    谢谢您的回答,但我仍然得到null((在您的代码中,我添加了
    getData(obj);console.log(returnedData);
    。我做错了什么?您可以使用。它应该是$.when(getData(obj))。然后是(function(data){//data的值为result now});与其求助于jQuery,不如使用Promise polyfill,在不支持ES6的地方添加Promise功能: