我正嘗試使用以下代碼在Chrome擴展程序中設置並獲取名稱值對。如何等待JavaScript函數使用Chrome.storage API返回響應?
if (!this.Chrome_getValue || (this.Chrome_getValue.toString && this.Chrome_getValue.toString().indexOf("not supported") > -1)) {
this.Chrome_getValue = function (key, def) {
chrome.storage.local.get(key, function (result) {
return result[key];
});
};
this.Chrome_setValue = function (key, value) {
var obj = {};
obj[key] = value;
return chrome.storage.local.set(obj)
}
}
我然後調用這些如下:
Chrome_setValue("City", "London");
var keyValue = Chrome_getValue("City");
問題是的keyValue總是「未定義」即使我放了1秒的延遲,試圖回讀值。我明白這是因爲'chrome.storage.local.get'函數是異步的..下面的代碼工作正常。
Chrome_setValue("City", "London");
chrome.storage.local.get("City", function (result) {
alert(result["City"]);
});
是否有任何約束力的keyValue(使用get
),我可以強制代碼等待函數返回的響應時的方式?或者我可能從錯誤的角度來解決這個問題。本質上,我正在尋找一種方法來抽象出在chrome.storage框架內處理數據的set
和get
方法?理想情況下,我可以調用兩個簡單函數來設置和檢索名稱值對。
在我使用localStorage之前,這非常簡單。
//Set
localStorage["City"] = "London";
//Get
var keyValue = localStorage["City"];
謝謝甜菜根,這是非常有建設性的!發佈後,我開始懷疑我是否過度思考這個問題。實際上,我需要我的Chrome擴展程序將數據從subdomain1.website.com持久保存到subdomain2.website.com,localStorage不會執行某些操作。許多解決方案都提到使用background.js,所以我現在正在探索這條道路。 – QFDev 2013-05-01 12:36:53
順便說一句,Chrome中用於存儲變量的任何方法都依賴於異步函數!所以沒有放棄使用上面描述的$ .Deferred()方法。我遇到的問題是搞清楚如何處理返回的dfrd.promise()對象...我如何從中找到值? – QFDev 2013-05-01 13:41:57
[This](http://api.jquery.com/category/deferred-object/)可能是瞭解Deferreds和Promises的最佳起點。要處理一個Deferred(以及由此派生的Promise派生)的值,需要創建處理程序(函數)作爲'.then()'或'.done()'方法的參數。 – 2013-05-01 17:01:51