2009-09-22 19 views

उत्तर

54

यह गलत दृष्टिकोण है। AJAX में पहला ए असीमित है। यह फ़ंक्शन AJAX कॉल रिटर्न से पहले लौटाता है (या कम से कम यह कर सकता है)। तो यह गुंजाइश का मुद्दा नहीं है। यह आदेश देने का मुद्दा है। वहाँ केवल दो विकल्प हैं:

  1. सुनिश्चित AJAX कॉल तुल्यकालिक ( अनुशंसित नहीं) async: false विकल्प के साथ; या
  2. सोचने का अपना तरीका बदलें। फ़ंक्शन से HTML को वापस करने के बजाय आपको AJAX कॉल सफल होने पर कॉलबैक पास करने की आवश्यकता होती है।

का एक उदाहरण के रूप (2):

function findPrice(productId, storeId, callback) { 
    jQuery.ajax({ 
     url: "/includes/unit.jsp?" + params, 
     cache: false, 
     dataType: "html", 
     success: function(html) { 
      callback(productId, storeId, html); 
     } 
    }); 
} 

function receivePrice(productId, storeId, html) { 
    alert("Product " + productId + " for storeId " + storeId + " received HTML " + html); 
} 

findPrice(23, 334, receive_price); 
+1

Gotchya तेज कर रहे हैं - मैं लगा मैं कि क्या करना है। लेकिन अगर मुझे ऐसा करना पड़ा तो क्या होगा? –

+0

यह जानने के लिए मुश्किल है कि आप getPrice() विधि का उपयोग कैसे करना चाहते हैं। इसके लिए क्या उपयोग किया जाता है? इसका उपयोग कैसे किया जा सकता है? यह उस "बाहरी" स्तर पर कोड है जिसे समायोजित करने की आवश्यकता होगी। – cletus

+0

ठीक है मुझे मिल गया। मुझे एहसास नहीं हुआ कि उत्पाद आईडी और स्टोर आईडी दायरे में होगा और मैं वास्तव में कॉल को वापस कॉल कर सकता हूं। –

11

वहाँ आपके गुमनाम समारोह अपने दायरे में returnHtml चर के लिए उपयोग किया है, और इसलिए कोड वहाँ वास्तव में के रूप में आप चाहते काम कर रहा है करता है उम्मीद करते हैं। जहां आप शायद गलत हो रहे हैं, आपके रिटर्न स्टेटमेंट में है।

याद रखें कि एकAJAX मेंasynchronous के लिए खड़ा है, जिसका अर्थ है कि यह एक ही समय में नहीं होता है। इसी कारण से, returnHtml = html के बाद वास्तव में return returnHtml; पर कॉल कर रहा है, इसलिए returnHtml अभी भी एक खाली स्ट्रिंग है।

यह कहना अपने कोड के बाकी देखे बिना क्या आप के रूप में आप चाहते हैं यह काम कर पाने के लिए क्या करना चाहिए कठिन है, लेकिन क्या तुम कर सकते हो कार्य करने के लिए एक और कॉलबैक जोड़ने है:

function getPrice(productId, storeId, callback) { 
    jQuery.ajax({ 
     url: "/includes/unit.jsp?" + params, 
     cache: false, 
     dataType: "html", 
     success: callback 
    }); 
} 

getPrice(5, 1, function(html) { 
    alert(html); 
}); 
13

कम जवाब है, आप नहीं कर सकते हैं, AJAX में पहला ए असिंक्रोनस के लिए खड़ा है, जिसका अर्थ यह है कि जब आप रिटर्न स्टेटमेंट पर जाते हैं तो अनुरोध अभी भी चल रहा है।

आप एक तुल्यकालिक (गैर async) अनुरोध के साथ यह कर सकते हैं, लेकिन यह आम तौर पर एक बुरा बात

कुछ निम्नलिखित oughta डेटा वापस की तरह है।

function getPrice(productId, storeId) { 
    var returnHtml = ''; 

    jQuery.ajax({ 
    url: "/includes/unit.jsp?" + params, 
    async: false, 
    cache: false, 
    dataType: "html", 
    success: function(html){ 
     returnHtml = html; 
    } 
    }); 

    return returnHtml; 
} 

लेकिन

जब तक आप वास्तव में बहुत सीधे परीक्षण से वापसी मान उपयोग करने में सक्षम होने की जरूरत है, तो आप हो जाएगा बहुत परीक्षण में एक कॉलबैक गुजर बेहतर।

function getPrice(productId, storeId, callback) { 
    jQuery.ajax({ 
    url: "/includes/unit.jsp?" + params, 
    async: true, 
    cache: false, 
    dataType: "html", 
    success: function(html){ 
     callback(html); 
    } 
    }); 
} 

//the you call it like 
getPrice(x,y, function(html) { 
    // do something with the html 
} 

संपादित शीश की तरह कुछ, तुम लोग कहने के लिए मैं क्या कहा :-)

+0

ब्राउज़र द्वारा 'async: false' ब्लॉक पेज प्रतिपादन सेट करेगा? –

+0

@ रामसरुप मुझे विश्वास है, हाँ –

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