2012-06-10 8 views
15

मुझे $ .get फ़ंक्शन की समस्या का सामना करना पड़ रहा है।AJAX "get" फ़ंक्शन सिंक्रोनस/परिणाम कैसे प्राप्त करें?

xyz = null 

    $.get('http://www.someurl.com/123=json', function(data) { 
     var xyz = data.positions[0].latitude; 
    }); 

alert(xyz); 
//some more code using xyz variable 

मुझे पता है कि xyz एक अशक्त परिणाम सूचित करेंगे क्योंकि $.getअतुल्यकालिक है: यूआरएल JSON

मेरी कोड में शामिल है।

तो क्या कोई तरीका है कि मैं इस कार्य के बाहर xyz का उपयोग कर सकता हूं?

+0

यदि आप 'var' कीवर्ड को अपने से बाहर ले जाते हैं फ़ंक्शन और अपने प्रारंभिक 'xyz' के सामने, फिर आप अपने एजेक्स अनुरोध को पूरा करने के बाद निष्पादित किसी भी फ़ंक्शन में उस दायरे में कहीं भी इसका उपयोग कर सकते हैं। – Paulpro

+4

जबकि * * * सिंक्रोनस ** AJAX (यह * jQuery में * दस्तावेज * है), आमतौर पर इसे उपयोगकर्ता अनुभव पर नकारात्मक प्रभाव के कारण * से बचा जाना चाहिए *। इसके बजाए, एसिंक्रोनस AJAX के इवेंट-आधारित मॉडल का उपयोग करने पर ध्यान केंद्रित करें। यही है, कॉलबैक के भीतर से * xyz' * के साथ डीओएम अपडेट करें। –

+0

@pst। हर समय एक ही सवाल है। यह एक और डोम तैयार समस्या है। – gdoron

उत्तर

7

असली जवाब नहीं है, लेकिन आप इस का उपयोग कर सकते हैं:

function useXYZ(){ 
    alert(xyz); 
} 

xyz = null   

$.get('http://www.someurl.com/123=json', function(data) { 
    xyz = data.positions[0].latitude; 
    useXYZ(); 
}); 
+0

वैश्विक संपत्ति पर समय और मानसिक भ्रम बर्बाद क्यों करें? (या बंद चर)। इसे अक्सर 'function useXYZ (xyz) {..} 'के रूप में बेहतर लिखा जाता है और फिर कॉलबैक से डेटा से गुजरता है। –

+0

@pst। मैंने ऐसा करने के लिए सोचा, लेकिन मैं उसे दिखाना चाहता था कि वह बाहरी चर का उपयोग कैसे कर सकता है। (बीटीडब्ल्यू, यह एक वैश्विक चर होना आवश्यक नहीं है)। आप सर की इच्छा के अनुसार संपादित कर सकते हैं! – gdoron

+0

धन्यवाद! सोचा कि यह चेतावनी के साथ अच्छी तरह से काम करता है मुझे अभी भी बाकी लिपि के साथ परेशानी हो रही है। और वास्तव में जब मुझे फ़ंक्शन का उपयोग करने के लिए बहुत सारी चीज़ें डालना पड़ता है EXYZ() {...} – Diolor

22

get एक शॉर्टकट है। तुम्हें पता है, एक ही है, लेकिन तुल्यकालिक कर सकते हैं का उपयोग कर:

var xyz = null 


$.ajax({ url: 'http://www.someurl.com/123=json', 
     async: false, 
     dataType: 'json', 
     success: function(data) { 
       xyz = data.positions[0].latitude; 
      } 
     }); 


alert(xyz); 

आप ajax कॉल करने से पहले xyz चर घोषित करने के लिए, हालांकि होगा।

+0

ठीक है, सभी ईमानदारी से मेरा प्रारंभिक उत्तर खराब था। मुझे वास्तव में अपने फोन से सवालों के जवाब देने की कोशिश करना बंद कर देना चाहिए। – HackedByChinese

+0

क्रोम और फ़ायरफ़ॉक्स में मुझे अभी भी एक शून्य मिल रही है। सफारी में अच्छी तरह से काम करता है – Diolor

+0

हम्म। मैंने सफारी, क्रोम, और फ़ायरफ़ॉक्स (ओएसएक्स पर) के साथ परीक्षण किया है। यहां एक शुद्ध उदाहरण http://jsfiddle.net/HackedByChinese/F2Ey5/1/ – HackedByChinese

4

यह जावास्क्रिप्ट के साथ एक आम समस्या है। जावास्क्रिप्ट कोड निरंतर उत्तीर्ण शैली में लिखा जाना चाहिए। यह कष्टप्रद है, लेकिन ऐसा कुछ है जिसे आप बहुत ज्यादा सोचने के बिना परिवर्तित कर सकते हैं।

मूल रूप से, जब भी हम जैसे

var x = someSyncFunction(a, b, c); 
//do something with x 
console.log(x); 

कुछ होता है हम इसे async कोड में समारोह एक निरंतरता समारोह में रिटर्न के बाद सभी कोड बनाने और की एक पैरामीटर में एक चर से एक्स बदल कर परिवर्तित कर सकते हैं निरंतरता कॉलबैक।

someAsyncFunction(a, b, c, function(x){ 
    //do something with x; 
    console.log(x); 
}); 

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

var getXyz = function(onResult){ //async functions that return do so via callbacks 
           //you can also another callback for errors (kind of analogous to throw) 
    $.get('http://www.someurl.com/123=json', function(data) { 
     var xyz = data.positions[0].latitude; 
     onResult(xyz); //instead of writing "return xyz", we pass x to the callback explicitely. 
    }); 
}; 

getXyz(function(xyz){ //this would look like "var xyz = getXyz();" if it were sync code instead. 
    console.log('got xyz'); 
}); 

चाल यहाँ करने के लिए कॉल में समारोह से सभी वापसी बयान बदलने के लिए है कॉलबैक फ़ंक्शन ऐसा सोचें कि एसिंक फ़ंक्शन कभी वापस नहीं आया है और किसी को वापस मूल्य देने का एकमात्र तरीका कॉलबैक पर उस मान को पास करना है।


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

+0

धन्यवाद! क्या होगा यदि मुझे जेएसओएन से अक्षांश के लिए अक्षांश और "एबीसी" के लिए "xyz" जैसे दो वर्रों को पकड़ना पड़ा? ऑनरसेट कैसे होगा और कार्य करेगा (xyz)। क्या मैं उन्हें दोनों के अंदर घोंसला कर सकता हूं या क्या मुझे दूसरा फ़ंक्शन (एबीसी) बनाना चाहिए? – Diolor

+0

आप दोनों ऑब्जेक्ट्स को एक ऑब्जेक्ट के अंदर पैकेज कर सकते हैं और ऑब्जेक्ट को कॉलबैक 'onResult ({lat: xyz, long: abc}) पर पास कर सकते हैं;' इसी तरह, आप सिंक्रोनस फ़ंक्शन से कई मान कैसे वापस कर सकते हैं) या आप हो सकते थे कॉलबैक फ़ंक्शन को एक 'ऑनसेट (xyz, abc) के बजाय दो पैरामीटर प्राप्त होते हैं; '। अधिक होने के बाद एक कॉलबैक सामान्य और परस्पर अनन्य गणना पथों के लिए सामान्य है। एक आम उदाहरण में एक सफलता (या "वापसी") कॉलबैक और एक त्रुटि (या "फेंक") कॉलबैक है। – hugomg

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