2008-08-27 13 views
45

मैं StudentId वापस जाने के लिए दायरे से बाहर कहीं और उपयोग करने के लिए $.getJSON()

j.getJSON(url, data, function(result) 
{ 
    var studentId = result.Something; 
}); 

//use studentId here 

की मैं इस scoping के साथ क्या करना है कल्पना कर सकते हैं चाहता हूँ से एक चर लौट सकते हैं, लेकिन यह सी #

उत्तर

37

हाँ, मेरा पिछला उत्तर काम नहीं करता है क्योंकि मैंने आपके कोड पर कोई ध्यान नहीं दिया है। :)

समस्या

कि अज्ञात फ़ंक्शन कॉलबैक फ़ंक्शन है - यानी getJSON, एक async आपरेशन उस समय में कुछ अनिश्चित बिंदु पर वापस आ जाएगी है तो भले ही चर का दायरा कि अज्ञात समारोह के बाहर थे (यानी एक बंद), यह मूल्य नहीं होगा आपको लगता है होगा यह होना चाहिए:

var studentId = null; 
j.getJSON(url, data, function(result) 
{ 
    studentId = result.Something; 
}); 

// studentId is still null right here, because this line 
// executes before the line that sets its value to result.Something 

किसी भी कोड है कि आप getJSON कॉल द्वारा निर्धारित studentId के मूल्य के साथ निष्पादित करने के लिए चाहते हैं की जरूरत है कि कॉलबैक फ़ंक्शन के भीतर या तो होने की या कॉलबैक निष्पादित करने के बाद।

-2

हम्म, अगर आप StudentId संपत्ति के साथ एक वस्तु धारावाहिक गए हैं तो मुझे लगता है कि यह हो जाएगा:

var studentId; 
function(json) { 
    if (json.length > 0) 
     studentId = json[0].StudentId; 
} 

लेकिन अगर आप StudentId ही वापस लौट रहे हैं शायद यह है:

var studentId; 
function(json) { 
    if (json.length > 0) 
     studentId = json[0]; 
} 

संपादित करें: या शायद .length भी आवश्यक नहीं है (मैंने केवल JSON में जेनेरिक संग्रह लौटा दिए हैं)।

# 2 संपादित करें, इस काम करता है, मैं तो बस का परीक्षण किया:

var studentId; 
jQuery.getJSON(url, data, function(json) { 
    if (json) 
     studentId = json; 
}); 

# 3 संपादित करें, यहाँ वास्तविक जे एस मैं प्रयोग किया जाता है:

$.ajax({ 
    type: "POST", 
    url: pageName + "/GetStudentTest", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    data: "{id: '" + someId + "'}", 
    success: function(json) { 
     alert(json); 
    } 
}); 

और aspx.vb में:

<System.Web.Services.WebMethod()> _ 
<System.Web.Script.Services.ScriptMethod()> _ 
Public Shared Function GetStudentTest(ByVal id As String) As Integer 
    Return 42 
End Function 
2

यदि आप अन्य कार्यों के प्रतिनिधि को चाहते हैं तो आप $ .fn के साथ jquery भी बढ़ा सकते हैं। अंकन तो जैसे:

 

var this.studentId = null; 

$.getJSON(url, data, 
    function(result){ 
     $.fn.delegateJSONResult(result.Something); 
    } 
); 

$.fn.delegateJSONResult = function(something){ 
    this.studentId = something; 
} 

 
59

यह json के लिए, उसी तरह C#

सी # के समान देखते हुए पूरा करने के लिए काम करते हुए async संचालन को निष्क्रिय और डेटाप्रकार स्थापित करने के लिए नहीं लगता है:

var mydata = []; 
$.ajax({ 
    url: 'data.php', 
    async: false, 
    dataType: 'json', 
    success: function (json) { 
    mydata = json.whatever; 
    } 
}); 

alert(mydata); // has value of json.whatever 
+3

यह एक बेहतर समाधान है, क्योंकि GetJSON एक async कॉल है, इसलिए प्रतिनिधि में चर सेट सेट एसिंक कॉल समाप्त होने से पहले पहुंच योग्य नहीं है। – Annagram

+0

दिलचस्प है कि मेरे पास "& callback =?" था मेरे यूआरएल में जो एसिंक को ओवरराइड करना प्रतीत होता था: झूठी सेटिंग। –

+2

धन्यवाद! अब, मैं यहां कुछ कर सकता हूं ... – Rimian

16

उपर्युक्त सभी से भी आसान है। जैसा कि पहले बताया गया है $.getJSON एसिंक को निष्पादित करता है जो समस्या का कारण बनता है। $.ajax विधि करने के लिए अपने सभी कोड पुनर्रचना करने के बजाय सिर्फ async व्यवहार को निष्क्रिय करने के लिए अपने मुख्य .js फ़ाइल के शीर्ष में निम्नलिखित सम्मिलित करें:

$.ajaxSetup({ 
    async: false 
}); 

अच्छी किस्मत!

+2

यह शीर्ष उत्तर होना चाहिए –

+0

@MostafaKing – danMad

+0

के साथ सहमत है यह अब तक का सबसे अच्छा जवाब है। धन्यवाद @ साइकिल। –

-1
var context; 
$.ajax({ 
    url: 'file.json', 
    async: false, 
    dataType: 'json', 
    success: function (json) { 
    assignVariable(json); 
    } 
}); 

function assignVariable(data) { 
    context = data; 
} 
alert(context); 
+0

सवाल 9 साल पहले पूछा गया था और आपका उत्तर पहले से पोस्ट किए गए उत्तरों में कोई महत्वपूर्ण सुधार नहीं जोड़ रहा है। – Khan