2012-12-12 16 views
5

फिक्स्ड! धन्यवाद! नीचे "सही कोड" देखें।jQuery रिटर्न वैल्यू अपरिभाषित

लक्ष्य डायलॉग बॉक्स से डेटा वापस प्राप्त करना है। मैंने बहुत से लेख देखे हैं, लेकिन उनमें से कोई भी काम नहीं कर सका, इसलिए मैंने संवाद बॉक्स और अंतर्निहित पृष्ठ के बीच डेटा को आगे और आगे पास करने के लिए एक वेब सेवा का उपयोग करने का निर्णय लिया।

कोड के अलावा सभी कोड वेब कोड से वापस आने वाले मानों को छोड़कर कोड में हैं। मैं डीबगर में देख सकता हूं कि डेटा वापस पारित किया जा रहा है, लेकिन जब मैं कॉलर पर वापस आ जाता हूं, तो लौटाया गया डेटा अपरिभाषित होता है।

jQuery फ़ंक्शन getLocal AJAX कॉल करता है, अच्छा डेटा वापस प्राप्त करता है, लेकिन जब यह उस फ़ंक्शन पर वापस आता है जो इसे कॉल करता है (verbListShow), लौटाया गया मान "अपरिभाषित" होता है।

यह सब एक एएसपी.नेट पृष्ठ में हो रहा है जो मुख्य रूप से jQuery में लिखा गया है, और एक jQuery संवाद बॉक्स खोलता है।

function getLocal(name) { 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "WebServices/FLSAService.asmx/GetLocalVariable", 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify({ name: name }), 
     success: function (data) { 
      var rtn = data.d; 
      return rtn; 
     } 
    }); 
} 

उपर्युक्त कोड काम करता है, लेकिन जब कहा जाता है, आरटीएन अनिर्धारित है।

function verbListShow(dutyNumber) { 

    $('#dlgDutyList').dialog({ 
     modal: true, 
     show: "slide", 
     width: 250, 
     height: 250, 
     open: function (event, ui) { 
      setLocal("DUTYNUMBER", dutyNumber); 
     }, 
     buttons: { 
      "Select": function() { 
       var id = getLocal("VERBID"); // <*** Returns undefined 
       var verb = getLocal("VERB"); // <*** Returns undefined 
       $.ajax({ 
        type: "POST", 
        async: false, 
        url: "WebServices/FLSAService.asmx/SetDuty", 
        dataType: 'json', 
        contentType: 'application/json; charset=utf-8', 
        data: JSON.stringify({ dutyNum: dutyNumber, id: id, verb: verb }), 
        success: function (data) { 
         data = $.parseJSON(data.d); 
         if (data.ErrorFound) { 
          showMessage(data.ErrorMessage, 2, true); 
         } 
         else { 
          log('Set Duty: ' + data.StringReturn + ' (' + data.intReturn + ')'); 
         } 
        }, 
        error: function (XMLHttpRequest, textStatus, errorThrown) { 
         alert("updateDuty: " 
          + XMLHttpRequest.responseText); 
        } 
       }); 

       $(this).dialog("close"); 
      }, 
      Cancel: function() { 
       $(this).dialog("close"); 
      } 
     } 

    }); 
    $('#dlgDutyList').dialog('open'); 

FIXED कोड::

function getLocal(name) { 
var rtn = ""; 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "WebServices/FLSAService.asmx/GetLocalVariable", 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify({ name: name }), 
     success: function (data) { 
      rtn = data.d; 
     } 
    }); 
return rtn; 
} 
+0

वेब सेवा नाम पोस्ट करने पर क्या लौटती है? क्या इसमें डी क्षेत्र है? कुछ नमूना डेटा दिखाएं .. –

+0

'वापसी आरटीएन; 'आप AJAX सफलता कॉलबैक से वापस नहीं आ सकते हैं। मेरा सुझाव है कि या तो GetLocal फ़ंक्शन का उपयोग न करें या इसे jqXHR ऑब्जेक्ट वापस कर दें। –

उत्तर

6

यह तुल्यकालिक उपयोग करने के लिए AJAX के प्रयोजन धरा (AJAX अतुल्यकालिक जावा स्क्रिप्ट और XML के लिए खड़ा है) यहाँ फोन करने वाले है।

अब आप नहीं return सफलता विधि से एक मूल्य है, लेकिन आप एक चर में संग्रहीत कर सकते हैं और फिर लौट सकते हैं कि

function getLocal(name) { 
    var returnValue; 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "WebServices/FLSAService.asmx/GetLocalVariable", 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify({ name: name }), 
     success: function (data) { 
      returnValue = data.d; 
     } 
    }); 
    return returnValue; 
} 

लेकिन उचित तरह से एक deferred object

उपयोग करने के लिए किया जाएगा
function getLocal(name, resultset) { 
    return $.ajax({ 
     type: "POST", 
     url: "WebServices/FLSAService.asmx/GetLocalVariable", 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify({ name: name }), 
     success: function (data) { 
      resultset[name] = data.d; 
     } 
    }); 
} 

और यह

0 फोन
3

सबकुछ इसलिए है क्योंकि $ .ajax फ़ंक्शन इसके असीमित व्यवहार के कारण कोई मूल्य नहीं लौटाता है, मेरी सलाह getLocal "कॉलबैक" नामक विधि के लिए दूसरा पैरामीटर बनाना है। तब

function getLocal(name, callback) { 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "WebServices/FLSAService.asmx/GetLocalVariable", 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify({ name: name }), 
     success: function (data) { 
      var rtn = data.d; 
      callback(rtn); 
     } 
    }); 
} 

, अपने मुख्य कोड है कि (अतुल्यकालिक कोड) की तरह लग रहे करने के लिए है:

उचित तरीके से इतना है कि यह करना है

//some code here 
buttons: { 
      "Select": function() { 
       getLocal("VERBID", function(id) { 
        getLocal("VERB", function(verb) { 
         $.ajax({ 
          type: "POST", 
          async: false, 
          url: "WebServices/FLSAService.asmx/SetDuty", 
          dataType: 'json', 
         //some code here 
        }); 
       }); 
//some code here 

इस कोड में सुधार करने के लिए, दो बनाने के लिए एसिंक्रोनस कॉल एक बार में, आप jQuery Deferred ऑब्जेक्ट का उपयोग कर सकते हैं, और सभी AJAX कॉल उचित प्रतिक्रिया प्राप्त करने के बाद ही .resolve(data) चला सकते हैं।

+0

दोनों उत्तरदाताओं के लिए धन्यवाद। मुझे आपकी सहायता के कारण कोड जल्दी से काम कर रहा है। –

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