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

时间:2016-06-08 10:34:53

标签: 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;
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
} 

据我所知here chrome.storage.local.get与其后果不同步。但有什么方法可以从chrome存储中获取一些内容并使其返回?我的意思是也许我应该将chrome.storage.local.get包裹在另一个函数中?

非常感谢提前!

4 个答案:

答案 0 :(得分:4)

如果您想远离全局变量并且您对现代浏览器要求感到满意,那么您可以实现原生JavaScript Promise object。例如,这是一个返回单个给定密钥的存储数据的函数:

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及更低版本的支持,那么您必须转向jQuery这样的库。

答案 1 :(得分:2)

不,这是不可能的

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

  1. 使用回调中的.get()返回的数据执行所有操作(或使用函数调用从那里开始)。这就是@wernersbacher发布的内容
  2. 看看延迟(jQuery或Q库)。可以从getData返回deferred的promise。在.get()回调中,您可以解决延迟。在getData之外,您可以使用.then()在延迟解决后执行某些操作
  3. 像这样的东西

    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
    };
    

答案 2 :(得分:1)

你必须这样做:

router.use('/inventory', require('./inventory'))
router.use('/transaction', require('./transaction'))

..因为你试图返回一个尚未从存储中读取的值,所以它是空的。

答案 3 :(得分:0)

您需要使用回调函数来处理它。这是两个例子。您可以使用单个函数进行设置,但是为每个“On Complete”创建一个单独的函数。您可以轻松地修改回调以通过其他参数来执行所需的任务。

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);
}