अवलोकन: मैं दोनों एक वेबपेज और एक वेब कार्यकर्ता से एक IndexedDB तक पहुँचने के साथ एक रेस स्थिति से बचने के लिए कोशिश कर रहा हूँ।प्रवेश IndexedDB
सेटअप: वेबपृष्ठ जो स्थानीय इंडेक्सड डीबी में आइटम सहेज रहा है क्योंकि उपयोगकर्ता साइट के साथ काम करता है। जब भी कोई उपयोगकर्ता स्थानीय डीबी में डेटा सहेजता है तो रिकॉर्ड को "अनसेंट" के रूप में चिह्नित किया जाता है।
वेब-वर्कर पृष्ठभूमि थ्रेड जो इंडेक्सड डीबी से डेटा खींच रहा है, इसे सर्वर पर भेज रहा है और एक बार जब सर्वर इसे प्राप्त करता है, तो इंडेक्सड डीबी में डेटा को "प्रेषित" के रूप में चिह्नित किया जाता है।
समस्या: के बाद से IndexedDB पर पहुँच अतुल्यकालिक है, मैं इसकी गारंटी नहीं किया जा सकता है कि उपयोगकर्ता एक ही समय वेब कार्यकर्ता सर्वर पर भेज रहा है पर एक रिकार्ड अपडेट नहीं होगा। समय नीचे दिखाया गया है:
- वेब कार्यकर्ता डीबी से डेटा हो जाता है और सर्वर
- हस्तांतरण हो रहा है जबकि को भेज देता है, उपयोगकर्ता डेटा डीबी में सहेजकर अद्यतन करता है।
- वेब कार्यकर्ता सर्वर से प्रतिक्रिया हो जाता है और उसके बाद डीबी अद्यतन करता है "प्रेषित" करने के लिए
- अब डीबी में डेटा है कि सर्वर के लिए भेजा नहीं किया गया है लेकिन चिह्नित के रूप में "प्रेषित"
असफल समाधान: सर्वर से प्रतिक्रिया प्राप्त करने के बाद, मैं यह देखने के लिए पंक्ति में फिर से जांच कर सकता हूं कि कुछ भी बदला गया है या नहीं। हालांकि मुझे अभी भी एक छोटी सी खिड़की के साथ छोड़ दिया गया है जहां डेटा डीबी को लिखा जा सकता है और इसे सर्वर पर कभी नहीं भेजा जाएगा।
उदाहरण: सर्वर के बाद कहते हैं डेटा सहेजा जाता है, तो:
IndexedDB.HasDataChanged(
function(changed) {
// Since this is async, this changed boolean could be lying.
// The data might have been updated after I checked and before I was called.
if (!changed){
IndexedDB.UpdateToSent() }
});
अन्य नोट: डब्ल्यू 3 कल्पना के अनुसार एक सिंक एपीआई नहीं है, लेकिन कोई भी तो यह कर सकते हैं फिर भी यह लागू किया गया है इस्तेमाल नहीं किया जाएगा (http://www.w3.org/TR/IndexedDB/#sync-डेटाबेस)। सिंक एपीआई को इस सटीक स्थिति से बचने के लिए वेब-वर्कर्स द्वारा उपयोग करने के लिए डिज़ाइन किया गया था, जिसे मैं मानता हूं।
इस पर किसी भी विचार की सराहना की जाएगी। लगभग एक हफ्ते तक इस पर काम कर रहे हैं और काम करने वाले किसी भी चीज़ के साथ आने में सक्षम नहीं हैं।
मुझे नहीं लगता कि आप एक सौदे का उपयोग किए बिना एक IndexedDB का उपयोग कर सकते है। समस्या यह है कि जब मैं सर्वर को डेटा भेजता हूं तो लेनदेन खुला नहीं रहेगा। – Shawn