2013-02-10 10 views
6

पर विचार करें:एक वेबएसQL क्वेरी सिंक्रोनस कैसे बनाएं?

var globalvar; 

function viewyearmain() { 
    db.transaction(function (tx) 
    { 
    tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], function (tx, results) 
    { 
     var len = results.rows.length; 
     msg = len; 
     globalvar = msg; 
    }, null); 

    }); 

    if (globalvar>0) 
    { 
    alert("ROWS FOUND"); 
    } 
    else 
    { 
    alert("ROWS NOT FOUND"); 
    } 
} 

समस्या यह है कि ROWS NOT FOUND दिखाई देती है क्योंकि लेन-देन समय if बयान तक पहुँच जाता है तक पूरा नहीं किया है।

उत्तर

5

एक अतुल्यकालिक कॉलबैक तुल्यकालिक, आप कितना यह होना चाहते हैं की परवाह किए बिना नहीं है।

बस सभी कोड कॉलबैक में परिणाम पर निर्भर करता है के लिए कदम:

var globalvar; 

function viewyearmain() { 
    db.transaction(function (tx) 
    { 
    tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], function (tx, results) 
    { 
     var len = results.rows.length; 
     msg = len; 
     globalvar = msg; 
     if (globalvar>0) 
     { 
     alert("ROWS FOUND"); 
     } 
     else 
     { 
     alert("ROWS NOT FOUND"); 
     } 
    }, null); 

    }); 
} 

वैकल्पिक रूप से, यह एक दूसरे समारोह में ले जाते हैं, और कहते हैं कि कॉलबैक से।

+0

@ माइकल एक प्रश्न पूछने के लिए, "प्रश्न पूछें" बटन का उपयोग करें। –

0
मेरी जानकारी के लिए

, WebSQL तुल्यकालिक SQL कथन का समर्थन नहीं करता। यह आमतौर पर एक अच्छी बात है, क्योंकि आप नहीं चाहते हैं कि SQL की प्रसंस्करण को आपके उपयोगकर्ता इंटरफ़ेस को बाधित या फ्रीज करें। इस प्रकार, सीएल का जवाब एक प्रश्न के परिणामों को संसाधित करने के लिए सही एसिंक्रोनस तंत्र प्रदान करता है। SequelSphere - An HTML5/JavaScript SQL Relational Database:

अगर, हालांकि, आप वास्तव में चाहते हैं तुल्यकालिक एसक्यूएल प्रश्नों, तो WebSQL विकल्प की जाँच करें।

यह 100% जावास्क्रिप्ट है, इसलिए इसे किसी भी ब्राउज़र में और किसी भी मंच पर चलाता है। इसके अलावा, यह इंडेक्स डीडी या लोकल स्टोरेज में अपना डेटा स्टोर करता है। इसमें कई घंटियां और सीटी भी शामिल हैं जो वेबएसक्यूएल नहीं करता है: जेएसओएन एकीकरण, चेंज ट्रैकर्स, उपयोगकर्ता-परिभाषित एसक्यूएल फ़ंक्शन, सिंचन एसक्यूएल प्रोसेसिंग इत्यादि। चूंकि वेबएसक्यूएल मानक को बहिष्कृत कर दिया गया है, मुझे लगता है कि यह एक उत्कृष्ट विकल्प है।

पूर्ण प्रकटीकरण: मैं WebSQL प्यार करता हूँ, लेकिन SequelSphere से शादी कर रहा हूँ।

+0

जानकारी के लिए धन्यवाद ... मैंने सीएल के विचार और उसके कामकाज के अनुसार पहले ही अपना कोड तय कर लिया है .. लेकिन मैं भी पोस्ट के माध्यम से जाउंगा .. धन्यवाद @ जॉन फाउलर .. – user2058890

+0

@ जॉन फाउलर मैं सीक्वेल स्पेयर जानना चाहता हूं ऑफ़लाइन समर्थन है या नहीं? –

+0

@ काना सेक्वेल स्पेयर ऑफ़लाइन समर्थन करता है (ऐप कैश मेनिफेस्ट फ़ाइल का उपयोग करके)। यह इंडेक्स डीडी या लोकल स्टोरेज में उस डेटा को संग्रहीत करता है (उस क्रम में, ब्राउजर का समर्थन करने के आधार पर)। –

0

यह थोड़ा देर हो चुकी है लेकिन इसके लिए क्या लायक है ... आप कॉल को तुल्यकालिक नहीं बना सकते हैं लेकिन आप Async जैसी लाइब्रेरी का उपयोग कर अपने कोड को सरल बना सकते हैं। यह ओवरकिल जैसा प्रतीत हो सकता है लेकिन यदि आपको पंक्ति में 3 या 4 कथन करने की ज़रूरत है तो यह आपके कोड को पढ़ने के लिए बहुत आसान बना सकता है।

async.waterfall([ 
    function(callback){ 
     db.transaction(function (tx) { 
      tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], 
       function (tx, results) { 
        var len = results.rows.length; 
        callback(null, len) 
       }, 
       function(){ 
        callback("An error occurred when reading data"); 
       } 
      }); 
     }); 
    }, 
    function(len, callback){ 
     // Now do something with the length. 
     console.log("The length is: " + len); 
    } 
]); 
0

मैं साल देर से की एक जोड़ी हूँ, लेकिन यह देखते हुए कि प्रश्न सीधे जवाब कभी नहीं था, मैं समझ मैं में मेरे दो सेंट फेंक चाहते हैं, साथ ही कुछ सुझाव जोड़ने गधा!

सबसे पहले, यदि आप इसे पढ़ रहे हैं, तो शायद आपको WebSQL का उपयोग नहीं करना चाहिए। यह इंडेक्सड डीबी के पक्ष में deprecated रहा है, जो इस बिंदु पर डब्ल्यू 3 सी मानकों के ट्रैक पर एकमात्र डेटाबेस है।

यदि किसी भी कारण से, आप WebSQL का उपयोग करने का इरादा रखते हैं, और आप इसके एसिंक्रोनस एपीआई ऑफ़र के लाभ के बिना जी सकते हैं (जिनमें से कुछ जॉन फाउलर के उत्तर में उल्लिखित हैं), तो आपको पता होना चाहिए कि इसका स्पेक भी synchronous API परिभाषित करता है।

तो हाँ, वेबस्क्लुएल में समकालिक रूप से कथन निष्पादित करने का एक तरीका है, बशर्ते आपके द्वारा विकसित किए जा रहे ब्राउज़र सिंक्रोनस एपीआई को कार्यान्वित कर चुके हों।

यदि आपको एक सिंक्रोनस इंटरफ़ेस से निपटने में कोई फर्क नहीं पड़ता है जो सिंक्रोनस के रूप में सरल है, तो BakedGoods देखें।

bakedGoods.getAll({ 
    filter: "valueObj.holdingType === 'month'", 
    storageTypes: ["webSQL"], 

    //Contains database configuration data and operation preferences 
    options: optionsObj, 

    complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){} 
}); 

इसका सरल इंटरफेस और बेजोड़ भंडारण की सुविधा समर्थन कुछ भंडारण की सुविधा के लिए विशेष विन्यास के लिए समर्थन की कमी की कीमत पर आता है:

इसके साथ, आपकी क्वेरी को क्रियान्वित करने के रूप में सरल है। उदाहरण के लिए, यह मल्टी-कॉलम प्राथमिक कुंजी के साथ वेबएसक्यूएल टेबल में स्टोरेज ऑपरेशंस के संचालन का समर्थन नहीं करता है।

तो यदि आप उन प्रकार की विशेषताओं का भारी उपयोग करते हैं, तो आप कहीं और देखना चाहेंगे।

ओह, और पूर्ण पारदर्शिता के लिए, बेक्डगूड्स वास्तव में आपके द्वारा बनाए रखा जाता है :)।

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