2012-11-21 13 views
5

मैं एक बंद में एक चर के मान बदलने के लिए कोशिश कर रहा हूँ अंदर वैश्विक चर बदलें:जावास्क्रिप्ट बंद

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     myVariable = data; 
    } 
}); 

इसका कारण यह है myVariable बंद को दिखाई नहीं देता काम नहीं करता। मैं इस कोड को कैसे बदलूं ताकि myVariable का मान बदल सके?

+1

यह सच नहीं है। परिभाषा के अनुसार, यदि यह वैश्विक है, तो यह सभी क्षेत्रों में पहुंच योग्य है। बेशक, यदि 'myVariable' नामक एक स्थानीय चर है, तो इसे वैश्विक संस्करण के बजाय संशोधित किया जाएगा। यदि यह वास्तव में वैश्विक है, तो आप इसे एक्सेस करने के लिए 'window.myVariable' कर सकते हैं। – mowwwalker

+1

आपका उदाहरण यह नहीं दिखाता है कि यह सफलता कॉलबैक के दायरे में क्यों दिखाई नहीं देगा। एकमात्र चीज जो इसे छुपाएगी, वह यह होगा कि एक ही नाम के साथ एक वैरिएबल है जो एक नजदीकी दायरे में है जो इसे छाया करता है। –

+0

हम्म, मुझे लगता है कि चर बदल नहीं रहा है क्योंकि AJAX कोई सिंक्रोनहाउस नहीं है। यह सुनिश्चित नहीं है कि इसे – user1811367

उत्तर

11

विपरीत, अपने कोड काम करता है। लेकिन देखकर तुम क्या करने की कोशिश कर रहे हैं और लाइनों मैं तुम्हें यह करने के लिए कोशिश कर रहे हैं अनुमान लगा रहा हूँ के बीच पढ़ने:

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     myVariable = data; 
    } 
}); 
alert(myVariable); // at this point myVariable is undefined!! 

यदि हां, तो आप अतुल्यकालिक कार्यों के बारे में जानने की जरूरत है।

असल में, $.ajax() वास्तव में AJAX अनुरोध सबमिट करने से पहले फ़ंक्शन देता है। यह बाद में AJAX अनुरोध करेगा जब ब्राउज़र जावास्क्रिप्ट को निष्पादित करने में व्यस्त नहीं है। जिसका अर्थ है कि जब आप myVariable के मान को अलर्ट करने का प्रयास करते हैं तो असाइनमेंट तब तक नहीं हुआ होगा।

और अधिक विस्तार के लिए यहाँ मेरी प्रतिक्रिया पढ़ें: JS global variable not being set on first iteration

केवल अच्छा समाधान जिस तरह से आप कोडिंग के बारे में सोचने को बदलने के लिए है। (एक तर्कसंगत खराब समाधान है जिसमें अजाक्स कॉल को सिंक्रोनस में बदलना शामिल है, लेकिन उसमें शामिल न होने दें, यदि आप मैन्युअल रूप से चाहते हैं या पढ़ते हैं तो आप इसे Google पर कर सकते हैं)।

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     myVariable = data; 
    } 
}); 
/* 
* Do lots of stuff with the returned value 
* of the myVariable variable 
* 
*/ 

अब आप इसे इस तरह से लिखने की ज़रूरत:

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     myVariable = data; 
     /* 
     * Do lots of stuff with the returned value 
     * of the myVariable variable 
     * 
     */ 
    } 
}); 

मूल रूप से है कि आप सफलता कॉलबैक में ajax कॉल के बाद लिखा है | किसी भी और सभी कोड का स्थान बदलना इसके बजाय ऐसा करने का। इसका उपयोग करने के लिए उपयोग किया जा रहा है (इंटरनेट पर इस प्रश्न के कितने प्रकार मौजूद हैं इसका निर्धारण)। लेकिन एक बार जब आप इसका इस्तेमाल कर लेंगे तो यह दूसरी प्रकृति बन जाती है।

प्रोग्रामिंग की इस शैली के लिए एक नाम नहीं है। इसे विभिन्न प्रकार के रूप में जाना जाता है: "घटना संचालित प्रोग्रामिंग" या "निरंतरता-गुजरने वाली शैली" या "ईवेंट प्रोग्रामिंग"। यदि आप और जानना चाहते हैं तो आप विभिन्न शर्तों को Google पर जा सकते हैं।

+0

यह संभवतः समस्या के केंद्र में आता है, हालांकि स्पष्टीकरण देने के लिए मुश्किल है। – tjameson

+0

@tjameson: मेरे अनुभव में, जब भी कोई कॉलबैक के परिणाम को एक संलग्न चर में निर्दिष्ट करने का प्रयास करता है तो यह सबसे अधिक संभावना है। इतने लंबे समय तक प्रश्नों का उत्तर दें और आप प्रश्नों के पैटर्न देखें। – slebetman

3

यदि वह कोड वैश्विक दायरे में है, तो मेरे वैरिएबल आंतरिक फ़ंक्शन के लिए दृश्यमान है। आप के बारे में यह एक स्थानीय चर द्वारा आच्छादित किया जा रहा चिंतित हैं, स्पष्ट रूप से वैश्विक की एक संपत्ति के रूप में इसे का उपयोग करें: अपने धारणा के

var myVariable; 
$.ajax({ 
    //stuff.... 
    success:function(data) { 
     window.myVariable = data; 
    } 
}); 
संबंधित मुद्दे