2016-06-08 3 views
0

в моем расширении хром Мне нужно использовать хромированное хранилище. В моем исходном сценарии сначала я создаю объект и добавляю его в хром-хранилище, а затем хочу получить оттуда и вернуть его. Нечто подобное:Расширение 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 
} 

Насколько я понял из herechrome.storage.local.get асинхронный с его последствиями. Но есть ли способ получить что-то из хранилища хрома и заставить его вернуть? Я имею в виду, может быть, я должен обернуть chrome.storage.local.get в другой функции или так?

Большое спасибо заранее!

+0

Вы можете использовать [обещания] (http://www.html5rocks.com/en/tutorials/es6/promises/). –

ответ

1

Вы должны сделать это так:

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 
} 

..because вы пытались вернуть значение, которое не получил чтения из памяти еще, так что нулевая.

+0

Благодарю вас за ответ, но я все равно получаю null ((В этот ваш код я добавил 'getData (obj); console.log (returnData);'. Что я делаю неправильно? –

2

Нет, это не возможно

Но есть несколько способов обойти эту проблему

  1. делать все, что вы хотите сделать с возвращаемые данные из .get() внутри обратного вызова (или начать его оттуда с помощью вызовов функций). Вот что написал @wernersbacher
  2. Взгляните на отложенные (библиотеки 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 
}; 
+0

это должно быть $ .when (getData (obj)). then (function (data) { // данные теперь имеют значение результата }); –

0

Вы должны справиться с функциями обратного вызова. Вот два примера. Вы используете одну функцию для установки, однако вы создаете отдельную функцию для каждого «Вкл.». Вы можете легко изменить свой обратный вызов, чтобы передать дополнительные параметры полностью, чтобы выполнить свою нужную задачу.

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); 
} 
Смежные вопросы