2009-04-20 19 views
6

पर विफल वापसी मूल्य पर कॉलबैक को बढ़ावा दें मेरे पास एक जावास्क्रिप्ट फ़ंक्शन है जो सर्वर पर AJAX कॉल करने के लिए एक सामान्य फ़ंक्शन को कॉल करता है। मुझे AJAX कॉल के कॉलबैक फ़ंक्शन से परिणाम (सत्य/गलत) पुनर्प्राप्त करने की आवश्यकता है, लेकिन परिणाम जो मुझे मिलता है वह हमेशा 'अपरिभाषित' होता है।कॉलर फ़ंक्शन रिटर्न मान

सब बिना सामान्य समारोह का एक सुपर सरलीकृत संस्करण मेरी तर्क होगा:

function CallServer(urlController) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic) 
        return true; 
       else 
        return false; 
      }, 
     error: 
      function(errorThrown) { 
       return false; 
      } 
    }); 
} 

और कार्यप्रणाली को कॉल यह की तरह कुछ होगा:

function Next() { 
     var result = CallServer("/Signum/TrySave"); 
     if (result == true) { 
      document.forms[0].submit(); 
     } 
    } 

"परिणाम" चर रहा है हमेशा 'अपरिभाषित', और इसे डिबग करने से मैं देख सकता हूं कि कॉलबैक फ़ंक्शन की "वापसी सत्य" पंक्ति निष्पादित की जा रही है।

यह क्यों हो रहा है इसका कोई विचार? मैं बबल कॉलबैक फ़ंक्शन से कॉलसेवर फ़ंक्शन पर वापसी मूल्य कैसे कर सकता हूं?

धन्यवाद

उत्तर

0

बस यह पता चला कि यह कैसे करें :) एक चर घोषित करना और कॉलबैक फ़ंक्शन से तदनुसार इसे अपडेट करना। बाद में मैं उस चर को वापस कर सकता हूं। मैं भविष्य पाठकों के लिए कोड की जगह:

function CallServer(urlController) { 
    var returnValue = false; 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic){ 
        returnValue = true; 
        return; 
       } 
      }, 
     error: 
      function(errorThrown) { 
       alert("Error occured: " + errorThrown); 
      } 
     }); 

     return returnValue; 
} 
+10

हालांकि यह आपके लिए काम कर रहा है, यह अप्रत्याशित कोड है, क्योंकि एसिंक पोस्ट के मूल्य को सेट करने से पहले आप कॉलसेवर से "रिटर्न वैल्यू" वापस कर सकते हैं। अंगूठे का नियम: सिंक्रोनस रैपर में एसिंक्रोनस कॉल लपेटें! –

+0

आप $ में देख सकते हैं। जब एसिंक्रोनस कॉल पर इंतजार करने के लिए एक तरीका है http://api.jquery.com/jQuery.when/ – Andbdrew

0

मैं आमतौर पर किसी भी कोड डाल कॉलबैक फ़ंक्शन के अंदर ही सफलता पर निष्पादित किया जाना है। मुझे नहीं लगता कि CallServer() वास्तव में कॉलबैक से वापसी मान प्राप्त करता है। मैं अन्य चौखटे के व्यवहार पर इस आधारित रहा हूँ, YUI जैसे मैं jQuery के साथ भी परिचित नहीं हूँ, इसलिए मैं पूरी तरह से गलत हो सकता है (, और AJAX:

function CallServer(urlController) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic) 
        document.forms[0].submit(); 
       else 
        // do something else 
      }, 
     error: 
      function(errorThrown) { 
       // handle error 
      } 
    }); 
} 

संपादित करें:

की तरह कुछ की कोशिश करो किसी भी ढांचे के बिना किए गए कॉल)। यदि ऐसा है, तो बस इस उत्तर को कम करें और एक टिप्पणी छोड़ दो, और मैं इस जवाब को हटा दूंगा।

+0

कैल्विन के जवाब में कुछ भी गलत नहीं है;) समस्या यह है कि यह सत्यापन उद्देश्यों के लिए एक पूरी तरह से सामान्य कार्य है, इसलिए मैं वहां कोड नहीं डाल सकता क्योंकि वैधता पास होने पर क्या करना है। मुझे किसी भी तरह से कॉलरवर बुलियन लौटने की ज़रूरत है। चीयर्स वैसे भी – antonioh

15

बस मामले में आप अतुल्यकालिक रास्ते जाने के लिए (जो एक बेहतर समाधान है, क्योंकि यह आपके ब्राउज़र स्थिर नहीं होगा, जबकि अनुरोध कर रही है) चाहते हैं, यहाँ कोड है:

function CallServer(urlController, callback) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: true, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       var ret = (someLogic); 
       callback(ret); 
      }, 
     error: 
      function(errorThrown) { 
       return false; 
      } 
    }); 
} 

function Next() { 
    CallServer("/Signum/TrySave", function(result) { 
     if (result == true) { 
      document.forms[0].submit(); 
     } 
    }); 
} 
+0

मेरा फ़ंक्शन सिंक होना है, लेकिन मुझे मूल्यों को वापस करने का तरीका नहीं पता था कुछ समय उपयोगी हो सकता है, तो धन्यवाद! – antonioh

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