2011-12-19 11 views
9

मोबाइल फोनगैप ऐप विकसित करते समय मुझे एक दिलचस्प समस्या थी। मुझे डेटाबेस से डेटा के 10 आइटम (फोनगैप्स एसक्यूएलएट एपीआई के माध्यम से) पूछने की ज़रूरत है ... कई जावास्क्रिप्ट एपीआई की तरह, यह असीमित था। जब आप अपनी क्वेरी बनाते हैं, तो आप "सफलता" हैंडलर में गुजरेंगे।जावास्क्रिप्ट में तुल्यकालिक व्यवहार प्राप्त करना?

अब, इस मामले में मेरी प्राथमिकता एक सिंक्रोनस क्वेरी विधि होगी जो केवल पूर्ण होने पर ही लौटा दी गई होगी। तब मैं सीधे लाइन कोड लिख सकता था जो कि प्रत्येक 10 आइटमों में से प्रत्येक के बाद 1 में पूछताछ करता था।

db.query("SELECT...", success() { 
    db.query("SELECT...", success() { 
     db.query("SELECT...", success() { 
      db.query("SELECT...", success() { 
       db.query("SELECT...", success() { 
       } 
      } 
     } 
    } 
} 

और यह मैं के रूप में के रूप में गहरी केवल आधा है:

PhoneGap (वास्तव में, मैं सभी जे एस से अधिक लेकिन यह देखें) मैं एक जानवर है कि इस तरह देखा लिखने के लिए मजबूर किया गया था के अतुल्यकालिक प्रकृति के कारण

जाना था (और बहुत सरल बनाया ...) ... जब, था मैं सी में SQLite का उपयोग किया गया है, मैं बस की तरह कुछ कर सकते थे:

db.query("SELECT...", resultA); 
db.query("SELECT...", resultB); 
db.query("SELECT...", resultC); 
db.query("SELECT...", resultD); 
db.query("SELECT...", resultE); 

मुझे ऐसा लगता है कि सफलता हैंडलर दृष्टिकोण बहुत अच्छा है जब आपको केवल 1 या 2 स्तरों को गहरा जाना है ... लेकिन, जब आपको अधिक थैला की आवश्यकता होती है तो पूरी तरह अलग हो जाती है n कि ...

क्या उनकी लाइब्रेरी या लाइब्रेरी की सुविधा कहीं और आसान है?

उत्तर

7

यह एक समस्या है जो समुदाय में इतनी प्रचलित है कि कई पैटर्न and libraries इसका मुकाबला करने के लिए उभरे हैं।

मेरा पसंदीदा वादा है। मैंने कुछ घटनाओं में एसिंक समस्या के समाधान के रूप में वादों पर एक प्रस्तुति दी; आप स्लाइडशेयर पर मेरी स्लाइड देख सकते हैं: Callbacks, Promises, and Coroutines (oh my!): The Evolution of Asynchronicity in JavaScript। यह भी बताता है कि क्यों Asynchronicity आवश्यक है --- संक्षेप में, क्योंकि जावास्क्रिप्ट एकल थ्रेडेड है।

आपके द्वारा दिए गए विशेष उदाहरण के लिए, स्लाइड 53 और वहां देखें। संक्षेप में, यह सोचते हैं db.query एक वादा लौट आए, यह देखने के लिए की तरह होगा:

db.query("SELECT...") 
    .then(function (a) { 
    return db.query("SELECT..." + a); 
    }) 
    .then(function (b) { 
    return db.query("SELECT..." + b); 
    }) 
    .then(function (c) { 
    return db.query("SELECT..." + c); 
    }) 
    .then(function (d) { 
    return db.query("SELECT..." + d); 
    }) 
    .then(function (e) { 
    return db.query("SELECT..." + e); 
    }); 
बेशक

यह एक बहुत अच्छा हो जाता है तो आप अगले के लिए एक क्वेरी के परिणामों का उपयोग करने की जरूरत नहीं है, तो:

Q.all([ 
    db.query("SELECT..."), 
    db.query("SELECT..."), 
    db.query("SELECT..."), 
    db.query("SELECT..."), 
    db.query("SELECT...") 
]).spread(function (a, b, c, d, e) { 
    // ... 
}); 
+0

कूल लाइब्रेरी। यह जानना अच्छा है कि मेरा जवाब पागल नहीं है, क्योंकि यह प्रभावी ढंग से आपके द्वारा अंतिम कोड नमूना क्या कर रहा है। +1 – cdeszaq

3

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

यह किसी भी बंद होने के लिए काम करेगा क्योंकि आप केवल सूची मूल्यों को कोड के समूह के समूह में सेट कर सकते हैं, और उसके बाद इसे सभी निष्पादित कर सकते हैं।

3

यदि यह महज नेस्टिंग जो आपको परेशान है, बस नाम से तरीकों श्रृंखला:

function success1() { 
    // do stuff to handle success 
    db.query("SELECT...", success2); 
} 

function success2() { 
    db.query("SELECT...", success3); 
} 

function success3() { 
    db.query("SELECT...", success4); 
} 

function success4() { 
    // do something 
} 

db.query("SELECT...", success1); 

यह अगर उन भीतरी सफलता संचालकों में से किसी कि परिभाषित किया गया था कुछ करने के लिए उपयोग की जरूरत है काम नहीं करेगा अपने व्याख्यात्मक दायरे में, लेकिन यह मामला नहीं हो सकता है (और यदि यह भी हो, तो भी आप श्रृंखला में अगले कार्य में तर्क के रूप में उन मानों को तर्क के रूप में पारित कर सकते हैं)।

1

एक ओपन सोर्स फ्रेमवर्क सिमिनोव हाइब्रिड के रूप में जाना जाता है, यह मूल (जावा) और वेब (जावास्क्रिप्ट) दोनों के लिए ओआरएम प्रदान करता है।इसका उपयोग करके आप सभी डेटाबेस ऑपरेशंस को तुल्यकालिक बना सकते हैं, क्योंकि यह ढांचा एंड्रॉइड द्वारा प्रदान किए गए संचार चैनल का उपयोग करता है जो सिंक्रोनस है।

इस ढांचे के साथ फोनगैप को एकीकृत करना बहुत आसान है। इसका उपयोग करके आप एक ही समय में मूल ओआरएम और वेब ओआरएम दोनों के साथ काम कर सकते हैं।

http://siminov.github.io/android-hybrid

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