在我的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
包裹在另一个函数中?
非常感谢提前!
答案 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)
不,这是不可能的
但是有几种解决这个问题的方法
.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
};
答案 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);
}