2016-06-08 34 views
0

在我的Chrome擴展中我需要使用鍍鉻存儲。在我的後臺腳本中,首先創建一個對象並將其添加到Chrome存儲中,然後我想從那裏獲取對象並返回。類似的東西: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 
} 

據我從here瞭解chrome.storage.local.get是異步的後果。但是,有沒有辦法如何從鉻存儲中獲得某些東西並使其返回?我的意思是也許我應該在另一個功能中包裝chrome.storage.local.get

非常感謝提前!

+0

您可以使用[promise](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

謝謝你的回答,但是我仍然得到空((你的這段代碼我加了'getData(obj); console.log(returnedData);'。我該怎麼做錯? –

2

不,這不是可能

但也有解決這個問題的幾種方法

  1. 你想從.get()返回的回調裏面的數據做的一切(或從那裏使用的函數調用啓動)。這就是@wernersbacher發佈的內容
  2. 看看deferreds(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))。然後(函數(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); 
} 
相關問題