2011-06-02 12 views
9

मैंने एक समस्या में भाग लिया है जहां मुझे Jquery में चल रहे एसिंक्रोनस जावास्क्रिप्ट विधि से कोई मान नहीं मिल रहा है। मेरे Jquery इस तरह दिखता है:एसिंक्रोनस जावास्क्रिप्ट विधि से रिटर्निंग मान?

$(document).ready(function() { 
$('#splash_image_upload').change(function() { 
    var file = this.files[0]; 
    var blob_string = create_blob(file); 
    alert(blob_string); 
}); 

मैं मूल्य है कि 'ऑनलोड' घटना से आता है उपयोग करने में सक्षम हूँ, लेकिन मैं वास्तविक मूल्य वापस नहीं कर पा रहे। `

function create_blob(file) { 
    var reader = new FileReader(); 
    reader.onload = (function() { return function(e) { return e.target.result; }; })(); 
    reader.readAsDataURL(file); 
} 

हर बार जब मैं इस समारोह 'blob_str' चर का मान 'अनिर्धारित' है शायद क्योंकि काम समारोह समाप्त हो गया है से पहले किया जाता है पर अमल: मैं इस कोशिश की है। मुझे सच में यकीन नहीं है कि इस बारे में कैसे जाना है। क्या इस तरीके से मैं इस मूल्य को वापस कर सकता हूं ??

create_blob(file, function(blob_string) { alert(blob_string) }); 

function create_blob(file, callback) { 
    var reader = new FileReader(); 
    reader.onload = function() { callback(reader.result) }; 
    reader.readAsDataURL(file); 
} 

(विशेष रूप से AJAX वाक्छल इस तरह की अतुल्यकालिक कॉल के साथ सुंदर मानक है:

+1

संबंधित: [? कैसे एक समारोह से एक AJAX कॉल से प्रतिक्रिया वापस जाने के लिए] (http://stackoverflow.com/प्रश्न/14220321/कैसे-से-वापसी-प्रतिक्रिया-से-एजेक्स-कॉल-टू-ए-फ़ंक्शन) – Bergi

उत्तर

22

आपका सबसे अच्छा शर्त, कुछ इस तरह create_blob को एक कॉलबैक गुजरती हैं और कॉलबैक जो कुछ भी किया जाना चाहिए करते हैं करने के लिए है)। आप सिंक्रोनिक रूप से बल के प्रयास में टाइमर की कुछ नाजुक गड़बड़ी को तार सकते हैं लेकिन एपीआई की प्राकृतिक शैली से लड़ना एक हारने वाली लड़ाई है।

+0

वाह धन्यवाद। मैंने कभी सोचा नहीं होगा। मैंने सोचा कि आप केवल ऑनलोड() फ़ंक्शन के अंदर मान वापस कर सकते हैं लेकिन फिर फ़ंक्शन एसिंक्रोनस है इसलिए फ़ंक्शन समाप्त होने से पहले इसे वापस कर दिया जाता है! बहुत सराहना की! – Kevin

0

यह कॉलबैक के साथ मुद्दा है। 'उत्तर' बाद में एक और पल में होने जा रहा है और विधि के मूल्यांकन के दौरान नहीं। यहां वापसी का थोड़ा सा उपयोग।

आपका कॉलबैक वापसी कोड बनाने मूल्य संभाल करने की जरूरत है और अधिक जटिल दिखता है:

reader.onload = function(e) { 
    // handle here the result 
    // do something with e.target.result 
}; 
संबंधित मुद्दे