2012-10-16 26 views
8

मुझे लगता है कि मेरे पास एक सापेक्ष सरल सवाल है, लेकिन मैं मंडलियों में सोचता रहता हूं और यहां तक ​​कि Google मुझे जवाब नहीं दे रहा है जिसके साथ मैं काम कर सकता हूं।जावास्क्रिप्ट WebSQL क्वेरी। कब समाप्त हुआ पता कैसे?

असल में मैं कुछ रिकॉर्ड कॉपी करने की कोशिश कर रहा हूं जो स्थानीय रूप से WebSQL का उपयोग करके संग्रहीत हैं। प्रतिलिपि समस्या नहीं है, लेकिन मुझे यह जानने की जरूरत है कि मेरे प्रोग्राम आगे बढ़ने से पहले सभी प्रति क्रियाएं कब समाप्त हो जाएंगी।

वेबएसक्यूएल कॉल को अतुलनीय बना दिया गया है, इसलिए आमतौर पर इन चीजों को करने का एकमात्र तरीका कॉलबैक फ़ंक्शन का उपयोग करना है। हालांकि, चूंकि क्वेरी लूप के भीतर की जाती हैं, इसलिए मैं कॉलबैक फ़ंक्शन का उपयोग नहीं कर सकता क्योंकि यह कोड में दिखाए गए पहले पूर्ण क्वेरी पर आग लग जाएगी।

कोड इस प्रकार है:

function copyRecords(old_parent_id, new_parent_id, callback){ 
    var db = openDatabase('test', '1.0', 'test', 50 * 1024 * 1024); 
    db.transaction(function (tx) { 
     tx.executeSql('SELECT * FROM table WHERE parent_id = ?', [old_parent_id], function(tx, results){ 
      for(var i = 0; i < results.rows.length; i++){ 
       db.transaction(function (tx2) { 
        tx2.executeSql('INSERT INTO table (name, parent_id) VALUES (?, ?)', [results.rows.item(i).name, new_parent_id], callback); 
       }) 
      } 
     }); 
    }); 
} 

मैं भी कॉलबैक फ़ंक्शन जब i == results.rows.length बुला की कोशिश की है, लेकिन है कि मुझे asure यह नहीं है कि सभी प्रश्नों पूरा कर रहे हैं।

मुझे लगता है कि आप में से कुछ को पहले भी एक ही समस्या का सामना करना पड़ा है, इसलिए इसे हल करने के तरीके पर कोई मदद नहीं है और यह सुनिश्चित कर लें कि कॉलबैक फ़ंक्शन केवल तब कहा जाता है जब लूप पूर्ण हो जाता है।

अग्रिम धन्यवाद।

+0

यह, परिणामों से गुजरने से बाहर भीतरी transacion स्थानांतरित करने के लिए संभव है ताकि आवेषण के चक्र लेन-देन के अंदर पूरी तरह से चला जाता है? – Stan

उत्तर

8

इस के लिए सामान्य दृष्टिकोण के बजाय प्रत्येक व्यक्ति के रिकॉर्ड एक for पाश कार्रवाई करने के लिए एक पुनरावर्ती async कॉलबैक उपयोग करने के लिए किया जाएगा।

जबकि अधिक रिकॉर्ड बाकी हैं, एसिंक कॉलबैक स्वयं को कॉल करता है। जब कोई रिकॉर्ड नहीं छोड़ा जाता है, तो यह आपके आपूर्ति किए गए कॉलबैक को कॉल कर सकता है।

नीचे कोड अपने भीतर कॉलबैक हैंडलर की सामग्री को बदलने होगा:

(function nextRecord() { 
    var row = results.rows.shift(); 
    if (row) { 
     db.transaction(function (tx2) { 
      tx2.executeSql('INSERT INTO table (name, parent_id) VALUES (?, ?)', 
       [row.item(i).name, new_parent_id], nextRecord); 
     }); 
    } else { 
     callback(); 
    } 
})(); 
+0

आपके उत्तर के लिए धन्यवाद! मैंने कभी भी पुनरावर्ती कार्यों का उपयोग करने के बारे में सोचा नहीं! – user1749815

+0

विचार के लिए धन्यवाद, लेकिन ऐसा लगता है कि वेब-एसक्यूएल परिणाम शिफ्ट() फ़ंक्शन का समर्थन नहीं करते हैं, क्योंकि यह एक सरणी नहीं है। तो मुझे मैन्युअल रूप से एक काउंटर बढ़ाना पड़ा, और यह काम किया! – Matthieu

2

यह "कॉलबैक" फ़ंक्शन निष्पादित करने की संख्या की गणना करने के द्वारा सबसे अच्छा किया जाता है, और केवल परिणाम सेट की पूरी राशि तक पहुंचने के बाद ही आगे बढ़ता है।

यहाँ संशोधनों के साथ अपने कोड है:

function copyRecords(old_parent_id, new_parent_id, callback){ 
    var db = openDatabase('test', '1.0', 'test', 50 * 1024 * 1024); 
    db.transaction(function (tx) { 
     tx.executeSql('SELECT * FROM table WHERE parent_id = ?', [old_parent_id], function(tx, results){ 
      if (results.rows.length == 0) 
       callback(); // don't forget this case! 
      else { 
       var nbrInserted = 0; // This will keep track of how many have been inserted 
       for(var i = 0; i < results.rows.length; i++){ 
        db.transaction(function (tx2) { 
         tx2.executeSql('INSERT INTO table (name, parent_id) VALUES (?, ?)', [results.rows.item(i).name, new_parent_id], function() { 
          ++nbrInserted; // increment this for every insert 
          if (nbrInserted == results.rows.length) // check if complete 
           callback(); // Do your callback. 
         }); 
        }); 
       } 
      } 
     }); 
    }); 
} 

मेरे लिए, मैं थोड़ा combersome होने की WebSQL की async एपीआई पाया, और के बाद से WebSQL डेटाबेस दूर जाने की संभावना (मानक किया गया है गिरा दिया गया), मैं अनुशंसा करता हूं कि हर कोई SequelSphere पर स्विच करें। यह एक HTML5/जावास्क्रिप्ट संबंधपरक डेटाबेस है जो सभी ब्राउज़रों और सभी प्लेटफ़ॉर्म पर काम करता है। यह स्थानीय स्टोरेज में डेटा भी स्टोर करता है, जिससे सभी परेशानियों के बिना इसे वेबएसक्यूएल के सभी लाभ मिलते हैं।

मुझे बताएं कि उपर्युक्त समाधान आपके लिए काम नहीं करता है या नहीं।

शुभकामनाएं!

जॉन ...

+0

आपको वास्तव में SequelSphere में अपनी रूचि घोषित करनी चाहिए थी। – Alnitak

+0

अच्छा प्वाइंट। आप बिल्कुल सही कह रहे है। कृपया क्षमा करें ... मैं सेक्वेल स्पेयर से जुड़ा हूं, और प्लग देने में मदद नहीं कर सका। –

+0

पी। async कॉलबैक बोझिल नहीं हैं - यह कैसे करें यह सही करने के लिए मेरा जवाब देखें! _ – Alnitak