2010-10-29 14 views
7

मैं वर्तमान में एक HTML5 iphone वेबैप पर क्लाइंट साइड डेटाबेस का उपयोग करता हूं। मेरी कोड में मैं अगर एक पंक्ति स्थानीय डीबी में मौजूद है जांच करने की आवश्यकता:एचटीएमएल 5 डाटाबेस एपीआई: सिंक्रोनस अनुरोध

function isStarted(oDB) { 
var ret = null; 
oDB.query(sql,params,function(transaction,result) { 
    if(result.rows.length > 0) { 
     ret = true; 
    } else { 
     ret = false; 
    } 
}); 

return ret; 

}

दुर्भाग्य isStarted (की वापसी) कॉलबैक समारोह से पहले होता है और मैं हमेशा एक "नल" मिल मूल्य। W3c spec में हम एक "सिंक्रोनस-डेटाबेस-एपीआई" देख सकते हैं लेकिन मैं इसका उपयोग कैसे कर सकता हूं? क्या एसिंक्रोनस आवश्यकताओं के साथ अच्छा "रेट" मान प्राप्त करने के लिए कोई चाल है?

आपकी मदद

+0

मुझे यह प्रश्न पसंद है। यह समस्या बहुत अच्छी तरह से बताता है। –

उत्तर

8

के लिए धन्यवाद एक वस्तु को लागू करने DatabaseSync आप openDatabase(...) के बजाय openDatabaseSync(...) कॉल करने के लिए प्राप्त करने के लिए। मुझे आईफोन के बारे में पता नहीं है, या आपके पास oDB ऑब्जेक्ट क्या है, लेकिन spec के अनुसार आपको वेबवर्कर में केवल openDatabaseSync विधि मिलती है, न कि सामान्य वेब ब्राउज़र window में। निश्चित रूप से XMLHttpRequest ने दिखाया है कि UI थ्रेड में संभावित-लंबाई सिंक्रोनस ऑपरेशंस एक अच्छा विचार नहीं है।

एसिंक्रोनस कोड को समकालिक रूप से चलाने या इसके विपरीत चलाने के लिए संभव नहीं है। ऐसा करने के लिए आपको भाषा-स्तर की विशेषताओं जैसे थ्रेड या सह-रूटीन की आवश्यकता होगी जो जावास्क्रिप्ट में नहीं है। आपको अपने कार्यों से बाहर निकलना होगा और ब्राउज़र पर नियंत्रण को HTTP अनुरोध या डेटाबेस क्वेरी करने की अनुमति देने के लिए, और आपको दिए गए हैंडलर फ़ंक्शन पर वापस कॉल करना होगा।

तो आपको डेटाबेस मूल्य IO से संबंधित कुछ भी करने पर, वापसी मूल्यों की अपेक्षा करने के बजाय कॉलबैक फ़ंक्शंस पास करने के लिए अपने कोड 'इन-आउट' को फिर से लिखना होगा।

function tellMeWhenIsStarted(oDB, callback) { 
    oDB.query(sql,params,function(transaction,result) { 
     callback(result.rows.length>0); 
    } 
}); 
+0

क्या आप कॉलबैक लौट रहे हैं, या इसे कॉल कर रहे हैं? –

+0

आप इसे कॉल कर रहे हैं। –

8

मैं इस अतुल्यकालिक अनुरोध हास्यास्पद को खोजने वाला अकेला हूं? अधिक से अधिक, ऐसा लगता है कि सफारी अभी केवल असीमित मॉडल लागू करता है ... मुझे आश्चर्य है कि हम कैसे कुशलतापूर्वक कोड ...

मैं async डीबी ड्राइवर के साथ गंभीर प्रोग्रामिंग के किसी भी लिंक का आनंद लेंगे।

-1

जब आप परिणामों को समकालिक रूप से पुनर्प्राप्त करना चाहते हैं तो आपको अगले निष्पादन को अवरुद्ध करना होगा, आपको जिस कीमत का भुगतान करना है वह यूआई निष्पादन के दौरान अवरुद्ध हो रहा है।

var ret = null; 
var finished = false; 

cfunction isStarted(oDB) { 
     oDB.query(sql,params,function(transaction,result) { 
       ret = result; 
       finished = true; 
     }); 

    while(!finished){ 
    ;//block next execution, while result is being fetched 
    } 
    return ret; 
} 
+1

यह कम से कम क्रोमियम 17.0.963.56 में काम नहीं करता है। यह भी वही है जो मैं उम्मीद करता हूं, क्योंकि जेएस में वास्तव में थ्रेड नहीं हैं, इसलिए, न केवल यूआई को लूप के दौरान अवरुद्ध किया गया है, बल्कि वास्तविक fetching भी है। – keppla

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