2011-01-02 14 views
9

मुझे यकीन है कि आप इस समस्या को जानते हैं, मैं अभी भी इसे कुछ दिनों के लिए हल करने की कोशिश कर रहा हूं। मैं सामान की बहुत सारी की कोशिश की है, लेकिन कोई भी काम किया:jquery AJAX रिटर्न: अपरिभाषित

यहाँ कोड

function lobbyLeader() { 
    $.ajax({ 
     data: {"id": 1, "request": "lobbyinfo", "method": "read"}, 
     url: 'api.php', 
     dataType: 'json', 
     success: function(data){ 
      result = data.leader; 
      return result; 
     } 
    }); 
} 

alert(result);1 दिखाएगा है, लेकिन जब एक अन्य समारोह में उपयोग कर इसे undefined कहते हैं।

+0

क्या आप "जब अन्य समारोह में उपयोग करते हुए" से क्या मतलब है? –

+0

क्या आप 'अलर्ट (लॉबी लेडर()) कर रहे हैं;' और 'अपरिभाषित' वापस प्राप्त कर रहे हैं? –

+0

"क्या आप अलर्ट कर रहे हैं (लॉबी लेडर()); और वापस अपरिभाषित हो रहा है?" हां – Nightbox

उत्तर

8

आप इस तरह के असीमित फ़ंक्शन से return नहीं कर सकते हैं, आप उस success कॉलबैक फ़ंक्शन से वापस लौट रहे हैं, न कि मूल कार्य।

function lobbyLeader() { 
    $.ajax({ 
    data: {"id": 1, "request": "lobbyinfo", "method": "read"}, 
    url: 'api.php', 
    dataType: 'json', 
    success: function(data){ 
     someOtherFunc(data.leader); 
    } 
}); 
} 
+0

मैंने दोनों कार्यों को विलय कर दिया है: http://pastebin.com/runiGzsd क्या आप मुझे बता सकते हैं कि वास्तव में इसे कैसे ठीक किया जाए? – Nightbox

+0

@ नाइटबॉक्स - 'if (function (data.leader) {' आपको चाहिए 'अगर (data.leader) {' –

+0

अनकही सिंटेक्स त्रुटि: अप्रत्याशित टोकन == http://pastebin.com/DN8Zk34G – Nightbox

4

समस्या यह है कि AJAX असीमित है (यह पहला ए खड़ा है)। इसका मतलब है कि समारोह तुरंत लौटता है; success हैंडलर केवल तभी कॉल किया जाता है जब अनुरोध सफल होता है। इसका मतलब यह है कि lobbyLeader आपके अनुरोध के तुरंत बाद लौटाता है, इसलिए कुछ भी नहीं लौटाता है।

यदि आपके पास डेटा प्राप्त करने के बाद चलाने के लिए कोई कोड है, तो इसे success हैंडलर (या another AJAX event handler) में रखा जाना चाहिए या इसके द्वारा बुलाया जाना चाहिए।

1

जब आप को उस अज्ञात फ़ंक्शन एसिंक्रोनस रूप से निष्पादित किया जाता है के भीतर से return मूल्यों, उन मूल्यों गुंजाइश श्रृंखला का प्रचार नहीं करेंगे, return बयान केवल है: इसके बजाय, आप जो कुछ भी, कॉलबैक में की जरूरत है इस तरह शुरू वर्तमान फ़ंक्शन स्कोप पर लागू, आसपास के दायरे पर नहीं, $.ajax() असीमित है, इसलिए कथन निष्पादित करने के तुरंत बाद, बाहरी फ़ंक्शन रिटर्न होता है, इसलिए बाहरी फ़ंक्शन का कोई रिटर्न वैल्यू नहीं होता है, यही कारण है कि आपको undefined मिल रहा है।

कॉलबैक फ़ंक्शन से संभावित वापसी मूल्य में हुक करने का एकमात्र तरीका $.ajax को पास किया गया वांछित डेटा में गुज़रने के लिए एक और बाहरी फ़ंक्शन का आह्वान करना है।

2

मैं इस तरह से सलाह देता हूं।

  1. async द्वारा AJAX कॉल का उपयोग करें: झूठी।
  2. AJAX कॉल के बाद रिटर्न स्टेटमेंट को ले जाएं।

उदाहरण:

function makeJQGridDataFromList(url) 
{ 
    var rowData; 
    var viewPage = 0; 
    var viewTotal = 0; 
    var viewRecords = 0; 

    var resultObject; 

    $.ajax({  
     type:"GET", 
     url:url,  
     async: false, 
     success:function(args){ 
      if(args.result==true) 
      { 
       try 
       { 
        viewPage = args.cond.pageIndex; 
        viewTotal = args.cond.recordCountPerPage; 
        viewRecords = args.cond.totalCnt; 

        rowData = jsonMakeRowsForGrid(args.data); 
       } 
       catch (e) 
       { 
        console.debug("Error!"); 
        alert("Invalid data"); 
        return; 
       } 
      } else 
      { 
       alert("API return ERROR!"); 
       return; 
      } 
     }, 
     error:function(e){ 
      alert("Fail AJAX communication"); 
      return; 
     } 
    }); 

    resultObject = { 
     page : viewPage, 
     total : viewTotal, 
     records : viewRecords, 
     rows : rowData 
    }; 

    return(resultObject); 
} 

आप निम्न विधि का परीक्षण कर सकते हैं।

var gridData = makeJQGridDataFromList(openAPIUrl); 
console.debug(">> " + JSON.stringify(gridData)); 

आप gridData देख सकते हैं (अन्य फ़ाइल (एचटीएमएल या js) में)।

मुझे एक ही समस्या का सामना करना पड़ा।:)

1

सही ढंग से कहा गया है कि आप वास्तव में सफलता से वापस नहीं आ सकते हैं, हालांकि, यदि आप ऐसा कर रहे हैं जो मुझे लगता है कि आप कर रहे हैं, और यह डेटा को पकड़ना और इसे वापस करना और उसे किसी अन्य क्षेत्र में असाइन करना है आईई

वर obj = lobbyLeader();

तो फिर तुम सिर्फ async के समारोह सेट कर सकते हैं: झूठी और obj लौट सफलता के बाहर होने के बाद कोड चलना समाप्त कर दिया। उदाहरण

function lobbyLeader() { 
var obj; 
    $.ajax({ 
    async:false; 
    data: {"id": 1, "request": "lobbyinfo", "method": "read"}, 
    url: 'api.php', 
    dataType: 'json', 
    success: function(data){ 
     obj= JSON.parse(data); 
    } 
}); 
    return obj; 
} 

इस तरह स्क्रिप्ट सफलता के लिए प्रतीक्षा करने के लिए बंद हो जाता है और फिर सेट करता है और रिटर्न।

+0

"jQuery 1.8 [तीन साल पहले!] के रूप में async का उपयोग: jqXHR ($ .Deferred) हटा दिया गया है, तुम इसी) पदावनत jqXHR.success() इस तरह के jqXHR.done (के रूप में jqXHR वस्तु के तरीकों या के बजाय सफलता/त्रुटि/पूरा कॉलबैक विकल्पों का उपयोग करना चाहिए "। http://api.jquery.com/jQuery.ajax/ वादे सीखना मुश्किल नहीं है, यह प्रयास के लायक है। निश्चित रूप से अनुरोध पूरा होने तक आपके पूरे यूआई को अवरुद्ध करने में निश्चित रूप से सुधार। –