javascript - Messy order of operations issue -
इस सवाल का पहले से ही एक उत्तर है: < / P>
- 21 उत्तर
मेरे पास एक फ़ंक्शन है जो दिखता है इस तरह से:
फ़ंक्शन showCreditCard (idx, डेटा) {यदि (प्रकार का कार्ड इनफ़ोन == 'अपरिभाषित' & amp; amp; parseInt ($ ("# cc-dropdown-" + idx + "विकल्प) : चयनित ")। Val (), 10) & gt; -1) {// वास्तविक चयन बना दिया है, लेकिन डिफ़ॉल्ट नहीं है, इसलिए cardInfo सेट नहीं किया गया है। क्रेडिट कार्ड प्राप्त करने के लिए अजाक्स कॉल चलाने की आवश्यकता है; Console.log ("शो ड्रॉपडाउन"); Console.log ("सहेजे गए कार्ड हैं और एक चयन किया गया था"); PoGetPaymentOption ('क्रेडिट कार्ड', parseInt ($ ("# cc-dropdown-" + idx + "विकल्प: चयनित")। Val (), 10), idx); // यह डिफ़ॉल्ट कार्ड है; डिफ़ॉल्ट चयनित और स्थिर फ़ील्ड console.log ("माना जाता है कि poGetPayment के बाद)" के साथ ड्रॉपडाउन प्रदर्शित करें; console.dir (cardInfo); // यह सामान poGetPaymentOtion खत्म होने से पहले क्यों चल रहा है और एक cardInfo वस्तु देता है? अगर (cardInfo.cc.cc_type == 'VI') {$ ('# cc_visaBig -' + idx) .attr ('class', 'cc_visaBig'); } $ ('# Cc-static-wrap -' + idx) .show (); updateButtonState (); }}
जैसा कि आप टिप्पणियों के द्वारा देख सकते हैं, उस कार्य के पहले वास्तव में पूर्ण होने से पहले
poGetPaymentOption कॉल चल रहे हैं। मैंने इसे
poGetPaymentOption फ़ंक्शन के साथ भी (नीचे) लॉग में सत्यापित किया है।
function poGetPaymentOption (प्रकार, कुंजी, बीआईडीएक्स) {if (type == ' क्रेडिट कार्ड ') {console.log ("साइन इन, क्रेडिट कार्ड"); $ .post ('/ site / ajax / customers / getSingleCreditCard', {'key': key}, फ़ंक्शन (डेटा) {यदि (data.success == 1) {console.log ("poPayment सफलता"); यदि ( Typeof cardInfo == 'अपरिभाषित') {cardInfo = new saveCardInfo (डेटा);}} else {console.log ("poPayment no success");}}, 'json'); }}
मैं जो होने की उम्मीद करता हूं वह
showCreditCard से
poGetPaymentOption से कॉल करने के लिए है यह करता है) और उसके बाद
cardInfo नामक एक नया
saveCardInfo ऑब्जेक्ट बनाएँ। यह तब तक होता है, जहां तक मैं बता सकता हूं, लेकिन ऑब्जेक्ट बनने से पहले
cardInfo.cc.cc_type और उसके आगे की जाँच की जा रही लाइनें हैं। मैंने अपने फायरबग कंसोल का एक स्क्रीनशॉट संलग्न किया है, इसलिए यह स्पष्ट है कि ऑर्डर चीजें हो रही हैं।
मैं क्या कर रहा हूँ गलत? मुझे यह सुनिश्चित करने की ज़रूरत है कि
poGetPaymentOption पूरी तरह से पूर्ण है और
cardInfo को
showCreditCard फ़ंक्शन में आगे जारी रखने से पहले बनाया गया है।
असल में, जब आपका कोड उस ईवेंट को चला रहा है जो तब होता है जब प्रतिक्रिया आती है, इसका प्रबंधन नहीं किया जा सकता। यहां तक कि यदि आप
showCreditCard फ़ंक्शन से बाहर निकलने से पहले प्रतिक्रिया आती है, तब तक ईवेंट का प्रबंधन नहीं किया जाएगा, जब तक आप फ़ंक्शन से बाहर नहीं निकलते हैं, तो जब तक आप
showCreditCard फ़ंक्शन।
फ़ेडर किए गए डेटा का उपयोग करने के लिए, आपको सफलता कॉलबैक फ़ंक्शन में ऐसा करने की आवश्यकता है। या तो उस फ़ंक्शन को कोड में स्थानांतरित करें, या
poGetPaymentOption में एक कॉलबैक फ़ंक्शन भेजें, इसलिए जब यह उत्तर आ गया है तो इसे कॉल कर सकते हैं।
(पूर्णता के लिए; एक तुल्यकालिक कॉल करने के लिए इसके बदले इसे आपके कोड काम को बिना दोबारा बनाने के लिए बनाया जाएगा, लेकिन यह सलाह नहीं है क्योंकि यह ब्राउज़र को फ्रीज करता है, जबकि यह प्रतिक्रिया की प्रतीक्षा कर रहा है।)
Comments
Post a Comment