9

मैं क्रोम एक्सटेंशन में नाम मान जोड़े सेट करने और प्राप्त करने के लिए निम्न कोड का उपयोग करने का प्रयास कर रहा हूं।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 उपयोग करते हुए) मैं कोड समारोह के लिए प्रतीक्षा करने के लिए एक प्रतिक्रिया वापस करने के लिए मजबूर कर सकता है? या शायद मैं गलत कोण से यह आ रहा हूं। अनिवार्य रूप से मैं क्रोम.स्टोरेज ढांचे के भीतर डेटा को संभालने के लिए set और get विधियों को सारणित करने के तरीके की तलाश कर रहा हूं? आदर्श रूप से दो सरल फ़ंक्शंस मैं नाम मूल्य जोड़ों को सेट करने और पुनर्प्राप्त करने के लिए कॉल कर सकता हूं।

इससे पहले कि मैं स्थानीय स्टोरेज का उपयोग कर रहा था जो बहुत सरल था।

//Set 
localStorage["City"] = "London"; 

//Get 
var keyValue = localStorage["City"]; 

उत्तर

4

QF_D, मैं यहाँ शिक्षित अटकलबाजी में हूँ, इसलिए पहली बार काम करने के लिए नहीं इस के लिए तैयार रहना .....

..... यहाँ जाता है:

if (!this.Chrome_getValue || (this.Chrome_getValue.toString && this.Chrome_getValue.toString().indexOf("not supported") > -1)) { 
    this.Chrome_getValue = function (key, def) { 
     var dfrd = $.Deferred(); 
     chrome.storage.local.get(key, function (result) { 
      dfrd.resolve(result[key]); 
     }); 
     return dfrd.promise(); 
    }; 
    this.Chrome_setValue = function (key, value) { 
     var dfrd = $.Deferred(); 
     var obj = {}; 
     obj[key] = value; 
     var listen = function(changes, namespace) { 
      dfrd.resolve(changes[key]); 
      chrome.storage.onChanged.removeListener(listen);//remove, to prevent accumulation of listeners 
     } 
     chrome.storage.onChanged.addListener(listen); 
     chrome.storage.local.set(obj); 
     return dfrd.promise() 
    } 
} 

इस प्रकार प्राप्त करें और सेट फ़ंक्शंस को jQuery वादे वापस करना चाहिए। सेट फ़ंक्शन द्वारा लौटाया गया वादा StorageChange ऑब्जेक्ट परिभाषित here के साथ हल किया गया है। आम तौर पर आपको इस वस्तु की आवश्यकता नहीं होगी, बल्कि हल किए गए वादे का जवाब दें।

उपर्युक्त सबकुछ अनचाहे है। मैं इसके बारे में भी निश्चित नहीं हूं:

  • chrome.storage.onChanged....। क्या यह chrome.storage.local.onChanged.... होना चाहिए?
  • .removeListener()। ऐसा लगता है कि addListener मौजूद है, हालांकि यह मौजूद होना चाहिए, हालांकि मुझे इसका कोई सबूत नहीं मिल रहा है।
+0

धन्यवाद बीटरूट, यह बहुत रचनात्मक है! इसे पोस्ट करने के बाद भी मुझे आश्चर्य हुआ कि क्या मैं इस समस्या को खत्म कर रहा था। प्रभावी रूप से मुझे subdomain1.website.com से subdomain2.website.com पर डेटा जारी रखने के लिए अपने क्रोम एक्सटेंशन की आवश्यकता है, कुछ स्थानीय स्टोरेज नहीं करता है। कई समाधान पृष्ठभूमि.जेएस का उपयोग करते हुए उल्लेख करते हैं, इसलिए अब मैं इस एवेन्यू की खोज कर रहा हूं। – QFDev

+0

परिवर्तनीय रूप से स्टोर करने के लिए क्रोम में किसी भी विधि को एसिंक फ़ंक्शन पर निर्भर करता है! इसलिए ऊपर बताए गए $ deferred() विधि का उपयोग करने से कोई फायदा नहीं हुआ है। मेरी समस्या यह है कि लौटा हुआ dfrd.promise() ऑब्जेक्ट के साथ क्या करना है यह पता लगाना है ... मैं इससे मूल्य कैसे प्राप्त कर सकता हूं? – QFDev

+0

[यह] (http://api.jquery.com/category/deferred-object/) शायद डिफर्रेड और वादे के बारे में सीखने के लिए सबसे अच्छा प्रारंभ बिंदु है। एक मूल्य के साथ काम करने के लिए जिसके साथ एक डिफर्ड (और इसलिए इसका वादा किया गया है) को पुनर्स्थापित किया गया है, हैंडलर (फ़ंक्शंस) को '.then() 'या' .done() 'विधियों के पैरामीटर के रूप में बनाएं। –

3

खैर, यह अनिवार्य रूप से है, क्योंकि chrome.storage एपीआई अतुल्यकालिक है। आप जावास्क्रिप्ट के मूल में कुछ ऐसा सामना कर रहे हैं।

क्या chrome.storage.get कॉलबैक में मार डाला है chrome.storage.get द्वारा वापस नहीं कर रहा है। आप इसे से निपटने के 2 तरीके हैं: कॉलबैक

  • में भंडारण मूल्य के साथ

    • सौदा वादा पैटर्न का उपयोग अपने कोड भावना रखने के लिए तुल्यकालिक (पिछले जवाब सीएफ)

    आपको वास्तव में सिंक्रोनस और असीमित के बीच का अंतर पता लगाना होगा।

  • संबंधित मुद्दे

     संबंधित मुद्दे