2012-02-20 17 views
6

मैं जावास्क्रिप्ट के लिए अपेक्षाकृत नया हूं और मैंने सोचा कि मुझे पता था कि कॉलबैक फ़ंक्शंस कैसे काम करता है लेकिन वेब खोजने के कुछ घंटों के बाद भी मुझे समझ में नहीं आता कि मेरा कोड क्यों काम नहीं कर रहा है।एक जावास्क्रिप्ट कॉलबैक फ़ंक्शन में स्थानीय चर सेट करना

मैं एक AJAX अनुरोध कर रहा हूं जो एक स्ट्रिंग सरणी देता है। मैं इस सरणी को स्थानीय चर में सेट करने की कोशिश कर रहा हूं, लेकिन जैसे ही कॉलबैक फ़ंक्शन निष्पादित किया जाता है, लेकिन ऐसा लगता है कि यह मूल्य का मूल्य खो देता है।

var array; 

    $.ajax({ 
     type: 'GET', 
     url: 'include/load_array.php', 
     dataType: 'json', 
     success: function(data){ 
      array = data; 
     }, 
     error: function(jqXHR, textStatus, errorThrown){ 
      alert("Error loading the data"); 
     } 
    }); 

    console.debug(array); 

कंसोल में, array अपरिभाषित के रूप में प्रकट होता है। क्या कोई मुझे बता सकता है कि यह क्यों सेट नहीं किया जा रहा है और कॉलबैक फ़ंक्शन में स्थानीय चर सेट करना संभव है।

उत्तर

7

समस्या यह है कि console.log अजेक्स कॉल अतुल्यकालिक रूप से निष्पादित करते समय सिंक्रनाइज़ निष्पादित करता है। इसलिए यह कॉलबैक पूरा होने से पहले चलता है, इसलिए यह array को undefined के रूप में देखता है क्योंकि success अभी तक नहीं चला है। इस काम को करने के लिए आपको console.log कॉल में success पूर्ण होने तक देरी करने की आवश्यकता है।

$(document).ready(function() { 
    var array; 

    var runLog = function() { 
     console.log(array); 
    }; 

    $.ajax({ 
     type: 'GET', 
     url: 'include/load_array.php', 
     dataType: 'json', 
     success: function(data){ 
     array = data; 
     runlog(); 
    }}); 
}); 
+0

मुझे लगता है कि आप कोड के स्वरूपण से उलझन में हैं। 'Console.debug' सीधे 'AJAX' के बाद है। –

+0

मेरा मानना ​​है कि स्कोपिंग सही है, यह सिर्फ दो प्रारूपों के लिए स्वरूपण बंद है (उन्हें बाएं 1 स्थानांतरित किया जाना चाहिए)। – GoldenNewby

+0

@ जेम्स मॉन्टगेन आप बिल्कुल सही हैं। प्रारूपण ने वास्तव में मुझे फेंक दिया। उत्तर अपडेट किया गया। – JaredPar

2

एजेक्स में पहला ए असिंक्रोनस के लिए है, जिसका अर्थ है कि जब तक आप सरणी को डिबग कर रहे हैं, तब भी परिणाम वितरित नहीं किया गया है। ऐरे को इसके मूल्य को प्रदर्शित करने के बिंदु पर अपरिभाषित है। आपको array =debug नीचे सरणी = डेटा करने की आवश्यकता है।

+0

आह हा, यह अभी स्पष्ट लगता! क्या AJAX का कोई विकल्प है कि आप यह गारंटी देने की अनुशंसा करेंगे कि प्रोग्राम निष्पादन जारी रखने से पहले प्रतिक्रिया के लिए इंतजार कर रहा है? – Alex

+0

आप जावास्क्रिप्ट में सिंक्रोनस http कॉल कर सकते हैं, लेकिन ऐसा कोई कारण नहीं है कि आपको इसे करना चाहें। अगली बार सही दायरे में नतीजे के साथ काम करना शुरू करें। – GoldenNewby

+2

वह एसजेएक्स है। तुल्यकालिक, यानी निष्पादन तब तक अवरुद्ध हो जाएगा जब तक परिणाम पुनर्प्राप्त नहीं किया जाता है। आपके अनुरोध में जेसन, यदि आप async: false को परिचय देते हैं, तो पुनर्प्राप्ति सिंक्रोनस होगी - सरल शब्दों में, आपका पिछला कोड काम करेगा। लेकिन फिर फिर, यह बुरा अभ्यास है। GoldenNewby द्वारा बताए गए कॉलबैक के अंदर अपना डिबगिंग कोड डालने का तरीका है। –

1

success फ़ंक्शन तुरंत निष्पादित नहीं होता है, लेकिन केवल HTTP-प्रतिक्रिया आने के बाद ही। इसलिए, इस बिंदु पर array अभी भी undefined है। यदि आप HTTP-प्रतिक्रिया डेटा पर संचालन करना चाहते हैं, तो इसे success फ़ंक्शन के भीतर से करें, या वैकल्पिक रूप से, उस ऑपरेशन को फ़ंक्शन के अंदर परिभाषित करें और उसके बाद उस फ़ंक्शन को success कॉलबैक के भीतर से आमंत्रित करें।

0

AJAX असीमित है। आप array चर सेट कर रहे हैं, लेकिन debug निष्पादित होने तक नहीं। एक AJAX कॉल बनाना एक अनुरोध भेजता है लेकिन फिर कोड में जारी रहता है। बाद के बिंदु पर, अनुरोध लौटाता है और आपका success या error कार्य निष्पादित होता है।

1

अपने success के बाद इस चर सेट करने के लिए एक समारोह कॉल करके देखें:

var array; 

var goodToProceed = function(myArr) { 
    console.debug(myArr); 
}; 

$.ajax({ 
type: 'GET', 
url: 'include/load_array.php', 
dataType: 'json', 
success: function(data){ 
    goodToProceed(data); 
}, 
error: function(jqXHR, textStatus, errorThrown){ 
    alert("Error loading the data"); 
} 
}); 
+2

क्यों एक अज्ञात फ़ंक्शन बनाने से परेशान है जो सफलतापूर्वक सीधे कॉल करने के बजाए अच्छा करने के लिए अच्छा है? – GoldenNewby

+0

हां गोल्डन न्यूबी, अच्छा बिंदु। मैं अक्सर यह करता हूं लेकिन वास्तव में, इसे करने की कोई ज़रूरत नहीं है। – adis

+0

@adis, कोड को उलझाने के लिए कभी-कभी ऐसा करने के लिए अच्छा होता है, हालांकि, आपको उस मामले में किसी अज्ञात फ़ंक्शन की आवश्यकता नहीं है। बस 'सफलता को परिभाषित करें: अच्छा करने के लिए,' – stivlo

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