Javascript Chrome扩展|有没有办法让Chrome.storage.local.get()返回一些东西?
在我的chrome扩展中,我需要使用chrome存储。在我的后台脚本中,我首先创建一个对象并将其添加到chrome存储中,然后我想从那里获取我的对象并将其返回。诸如此类: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
...
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发布的内容.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功能: