इस सप्ताह के अंत में, मुझे अतुल्यकालिक एपीआई इंडेक्सडीडीबी के साथ काम करने का आनंद मिला।
मोज़िला उदाहरण पार्सिंग क्षेत्र मुझे लगता है कि कोड उतना अच्छा नहीं है जितना कि यह हो सकता है।
और मैंने अपने अतुल्यकालिक एपीआई के लिए एक आवरण लिखने के लिए IndexedDB के साथ अपने
मनोचिकित्सा कौशल को विकसित करने का निर्णय लिया।
सच कहूं तो, मैं लेख लिखने का प्रशंसक नहीं हूं, क्योंकि मैं हमेशा शब्दों को पढ़ने के लिए बहुत आलसी था, मुझे कोड पढ़ना पसंद है, इसलिए आमतौर पर मेरे लेखों में बहुत सारे हैं।
अगर आपको भी कोड पसंद है, तो मैंने इसे
जीथब पर पोस्ट किया
वास्तव में, यह आलेख वर्णन करता है कि
आवरण के उपयोग के उदाहरणों में क्या लिखा गया है, ठीक है, शायद थोड़ा और।
कोड के बारे में, कई ने शायद सोचा, तो क्या आप उस कोड को देखेंगे जो मैंने अभी या हाल ही में पढ़ा है, यहां लिखा है ...
हां, कभी-कभी वे उस कचरे को खिसका देते हैं। मैं इस कोड को दार्शनिक और हास्य से संबंधित करता हूं। मुझे पूरी उम्मीद है कि मैं आपको हँसा नहीं पाऊंगा, प्रिय पाठक।
मुझे वर्तमान आपी में क्या पसंद नहीं था
HTML5 / ब्राउज़र मानक डेवलपर्स हमें क्या दे रहे हैं, इसकी कई कमियां हैं:
- कॉल चेन को लागू करने के लिए अतिरिक्त कोड लिखना होगा;
- अपने ईवेंट हैंडलर को तार्किक कार्यों के लिए लिखें: रिपॉजिटरी बनाना और उसे भरना, एक इकाई को अपडेट करना / बनाना, एक कर्सर को पूरा करना;
- कई ब्राउज़रों का समर्थन करें। अब कई ब्राउज़र ने IndexedDB के इन या उन विशेषताओं को लागू नहीं किया है, उदाहरण के लिए, गिनती और onupgradeneeded वेबकिट में नहीं हैं;
- अतिरेक - कई कार्यों को याद रखें जो लगभग एक ही काम करते हैं। उदाहरण के लिए: IDBObjectStore.get, IDBObjectStore.openCursor, IDBIndex.openKeyCursor, IDBIndex.openCursor
उदाहरण के लिए
भंडारण के
निर्माण को लें। यह मुझे व्यक्तिगत रूप से लगता है कि ऐसा कोड बोझिल है। मुझे अच्छा लगता अगर कोड इस तरह दिखता:
- var init = function ( घटना ) {
- अगर ( db। समाहित है ( 'ग्राहक' ) )
- वापसी;
- db। createStore ( 'ग्राहक' , { keyPath : 'ssn' } )
- । createIndex ( 'नाम' , { अद्वितीय : गलत } )
- । createIndex ( 'आयु' , { अद्वितीय : गलत } )
- । createIndex ( 'ईमेल' , { विशिष्ट : सत्य } )
- । पूरा ( समारोह ( घटना ))
- कंसोल। जानकारी ( 'स्टोर किए गए ग्राहक' , ईवेंट ) ;
- } )
- । जोड़ें ( customerData )
- । त्रुटि ( errorHandler )
- । सफलता ( समारोह ( घटना ))
- कंसोल। जानकारी ( 'सफलता जोड़ें' , घटना ) ;
- } ;
- } ;
यह कोड उदाहरण से कोड की तुलना में थोड़ा अधिक कार्यात्मक है, उदाहरण के लिए, घटनाओं को सभी कार्यों पर पंजीकृत किया जाता है, जैसे:
- निर्माण के पूरा होने और भरने की पूरी प्रक्रिया है
- त्रुटि से निपटने
- सफल जोड़
भी, क्योंकि काम उस एप्लिकेशन में नहीं किया जाता है जो पहले क्लाइंट द्वारा स्थापित किया गया था, लेकिन वेब के साथ। इसलिए, पृष्ठ को पहली बार लोड किया जा सकता है, मैं डेटाबेस के साथ काम करने के संदर्भ में कुछ घटनाओं को जोड़ना चाहूंगा: उदाहरण के लिए
- var db = new inDB ( { नाम : 'testDatabase' , संस्करण : 42 } )
- । त्रुटि ( errorHandler )
- // तैयार होने से पहले
- । init ( init )
- । versionChange ( समारोह ( घटना ) {
- कंसोल। लॉग ( 'संस्करण बदल गया, टाइमस्टैम्प:' , ईवेंट। टाइमस्टैम्प , ', नया संस्करण:' , यह संस्करण ) ;
- } )
- // WebKit, 2012-02-22 के अनुसार, अभी तक इसे लागू नहीं करता है।
- । अपग्रेड किया गया ( फ़ंक्शन ( ईवेंट ))
- कंसोल। लॉग ( 'onupgradeneeded, newVersion:' , event। newVersion , ', oldVersion' , ' , event। पुराना वीडियो , ', टाइमस्टैम्प: ' , ईवेंट। timeStamp , इवेंट ) ;
- init। कॉल ( यह , घटना ) ;
- } )
- । तैयार ( समारोह ( घटना ))
- // ...
- } ;
यानी संस्करण परिवर्तन के बारे में जानें, स्टोरेज को इनिशियलाइज़ करें और उन्हें डेटा से भरें और फिर रिपॉजिटरी तैयार होने पर काम करना शुरू करें
, अतुल्यकालिक, कॉम्पोट ।
अगर मैंने आपको आश्वस्त नहीं किया है, तो पढ़ना व्यर्थ है।
मेरा रास्ता
मेरे लिए, ये विचार मेरे जारी रहने के लिए पर्याप्त थे। क्योंकि
बाद में जो मैंने
मोज़िला उदाहरण में देखा, वह मुझे और भी अच्छा नहीं लगा। यानी उदाहरण के लिए लोगों को बहुत धन्यवाद, लेकिन मैं उस तरह से जीना नहीं चाहता)। मैं इसे बहुत पसंद करता अगर यह इस तरह दिखता:
- db। ओपनस्टोर ( 'ग्राहक' )
- । प्राप्त करें ( '444-44-4444' )
- । त्रुटि ( errorHandler )
- । सफलता ( समारोह ( घटना ))
- कंसोल। लॉग ( यह परिणाम ) ;
- } ;
और इस तरह एक अलग सूचकांक के लिए:
- db। ओपनस्टोर ( 'ग्राहक' )
- । प्राप्त करें ( 'नाम' , 'आर्टुर' )
- // ...
कर्सर से डेटा का चयन करने के लिए, मैं एक निष्पादन संदर्भ और ऑपरेशन की शुरुआत के लिए अलग-अलग ब्लॉक रखना चाहता हूं, मध्यवर्ती मान और अंत, कुछ इस तरह से:
- db। ओपनस्टोर ( 'ग्राहक' )
- । मिल ( फ़ंक्शन ( क्वेरी ))
- वापसी क्वेरी
- । बाध्य ( 'उम्र' , 30 , 60 , सच , सच ) ; // सभी उम्र 30> x && <60
- // केवल एक इंडेक्सडेड डिज़ाइन द्वारा अनुक्रमित करें, कृपया प्राप्त करने के बाद उपयोग करें
- } )
- । कहाँ ( फ़ंक्शन ( आइटम ) {
- वापसी आइटम । ईमेल करें। पदार्थ ( - )) । toLowerCase ( ) ! = 'home.org' ;
- } )
- । त्रुटि ( errorHandler )
- । प्रारंभ ( फ़ंक्शन ( संदर्भ ) {
- संदर्भ। परिणाम = [ ] ;
- कंसोल। समय ( 'IDBKeyRange द्वारा सभी प्राप्त करें' ) ;
- } )
- । समाप्त हो गया ( फ़ंक्शन ( संदर्भ ) {
- कंसोल। timeEnd ( 'IDBKeyRange द्वारा सभी प्राप्त करें' , संदर्भ। परिणाम ) ;
- } )
- । सफलता ( कार्य ( घटना , संदर्भ ) {
- var ग्राहक = यह । परिणाम । मूल्य ;
- कंसोल। जानकारी ( 'IDBKeyRange द्वारा प्राप्त' , customer.ssn , ग्राहक , ईवेंट , यह ) ;
- अगर ( ग्राहक। ssn == '111-11-1111' ) {
- ग्राहक। आयु = 6 ;
- // केवल कर्सर के लिए
- संदर्भ। अद्यतन ( ग्राहक ) ;
- }
- संदर्भ। परिणाम । धक्का ( ग्राहक ) ;
- } ;
मैंने अपनी दृष्टि को लागू किया कि इस तरह की वास्तुकला के साथ डेटाबेस में अतुल्यकालिक पहुंच कैसे
indb.js. में दिखना चाहिए।
खाने के लिए अभी भी बहुत कुछ है, उदाहरण के लिए, आप स्टोरेज ऑब्जेक्ट के बदलाव / निर्माण के बारे में घटनाओं को पंजीकृत कर सकते हैं, डेटाबेस या स्टोरेज को हटाना बहुत आसान है।
PS: FF में उदाहरण कोड चलाने वालों के लिए, अब IndexedDB इंजन के कार्यान्वयन में एक उत्सुक बग है। यदि आप customer.age = 6 बदलते हैं; ++ customer.age पर; फिर डेटाबेस के मनोरंजन के बाद आपको 60 साल की मारिया की उम्र मिल जाएगी, और 41 नहीं। यह भी दिलचस्प है कि अगर आप 5 सेकंड के समय से पहले सफाई से पहले स्क्रिप्ट को पुनः आरंभ करते हैं, तो सब कुछ ठीक होगा।
UPD 1: FF में चलाने के लिए, फाइल सिस्टम से नहीं, बल्कि किसी भी होस्ट पर, लोकलहोस्ट करेगा।
UPD 2: सर्वर साइड के लिए, आप
http://tamejs.org/ की ओर देख सकते हैं, लिंक के लिए एंड्री कोज़लोव का धन्यवाद)