2011-09-15 11 views
7

मेरे पास एक जेएस फ़ंक्शन है जहां एक मान की गणना की जाती है और यह मान वापस किया जाना चाहिए, लेकिन मुझे हर बार undefined मिलता है लेकिन यदि मैं console.log() परिणाम इस फ़ंक्शन के भीतर काम करता है। क्या आप सहायता कर सकते हैं?image.onload फ़ंक्शन के साथ

function detect(URL) { 
    var image = new Image(); 
    image.src = URL; 
    image.onload = function() { 
     var result = [{ x: 45, y: 56 }]; // An example result 
     return result; // Doesn't work 
    } 
} 

alert(detect('image.png')); 
+3

नोट: इससे पहले कि आप '.src' सेट क्योंकि' जब आप सेट onload' तुरंत ट्रिगर कर सकते हैं '.src' यदि छवि ब्राउज़र कैश में है तो आप भी' .onload' हैंडलर स्थापित करना चाहिए। यदि आप बाद में '.onload' सेट करते हैं, तो यह लोड ईवेंट को याद कर सकता है और कभी भी आग नहीं लगा सकता है। – jfriend00

उत्तर

3

मैं इसे अपने आप मिल:

मुझे पता नहीं था कि मुझे लगता है कि करने के लिए एक चर असाइन कर सकते हैं (मुझे पहले से ही सौंपा तलाश के लिए) ऑनलोड।

function detect(URL) { 
    var image = new Image(); 
    image.src = URL; 
    var x = image.onload = function() { 
     var result = [{ x: 45, y: 56 }]; // An example result 
     return result; 
    }(); 
    return x; 
} 

alert(detect('x')); 
+2

यह बहुत मतलब नहीं है। आप फ़ंक्शन निष्पादित करते हैं, फिर परिणाम को 'image.onload' पर सेट करें। तो 'image.onload' एक सरणी होगी, जबकि यह एक कार्य होना चाहिए। फिर आप उस सरणी को 'x' पर भी सेट करते हैं और इसे वापस कर देते हैं। आपको 'पता (...)' से सरणी वापस मिलती है, लेकिन 'ऑनलोड' का पूरा विचार खो गया है। – pimvdb

2

detect() कोई मूल्य नहीं लौटाता है। अगर आप एक चेतावनी प्राप्त करना चाहते हैं, return result;alert(result) द्वारा प्रतिस्थापित करें।

अपने कोड के विश्लेषण:

function detect(URL) { 
    ... 
    image.onload = function(){ //assigning an event handler (function) to an object 
     ... 
     return result; //this return statement is called from within another function 
    } 
}//function "detect" ends here. No return statement has been encountered 
+0

मैं नहीं है कुछ भी बताना चाहते हैं कि सिर्फ परीक्षण :) – Poru

1

आपका समारोह detect कुछ भी वापस नहीं करता है, जिसके कारण alert दिखाया जा रहा है "अनिर्धारित"। return कथन जो आप दावा करते हैं वह काम नहीं करता है, जो आप image.onload पर असाइन किए गए अज्ञात फ़ंक्शन से लौट रहे हैं, और यदि आप फ़ंक्शन पर कॉल करेंगे तो शायद ठीक काम करता है।

+0

हाँ लिए किया गया था चाहते हैं,, लेकिन वह डोम में चित्र जोड़ी नहीं पड़ता अगर छवि कभी नहीं भार और गतिविधि सक्रिय कभी नहीं है –

+0

@NicolaPeluchetti: यह सच है, लेकिन वह है यहां सवाल नहीं है, और 'अधिभार' शायद वैसे भी वापसी मूल्य को अनदेखा करता है। अगर वह किसी भी तरह से उस समारोह को मैन्युअल रूप से कॉल करेगा, तो वापसी * ​​काम करेगा। – Anomie

3

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

आप की तरह कुछ कर सकता है:

function detect(URL) { 
    var image = new Image(); 
    image.src = URL; 
    image.onload = function() { 
     var result = 'result'; // An example result 
     alert(result); // Doesn't work 
    } 
    document.body.appendChild(image) 
} 

detect('http://www.roseindia.net/javascript/appendChild-1.gif'); 

बेला यहाँ http://jsfiddle.net/LVRuQ/

19

मान दिया जाता है, लेकिन detect समारोह से नहीं।

आप एक गुमनाम समारोह के बजाय लोड ईवेंट हैंडलर के लिए एक नामित समारोह का उपयोग करते हैं, यह स्पष्ट है क्या हो रहा है:

function handleLoad() { 
    var result = [{ x: 45, y: 56 }]; 
    return result; 
} 

function detect(URL) { 
    var image = new Image(); 
    image.src = URL; 
    image.onload = handleLoad; 
} 

मूल्य कोड कि ईवेंट हैंडलर कॉल करने के लिए handleLoad समारोह से वापस आ रहा है, लेकिन detect फ़ंक्शन पहले से ही बाहर निकल चुका है। फ़ंक्शन में return कथन भी नहीं है, इसलिए आप परिणाम को undefined पर कुछ भी उम्मीद नहीं कर सकते हैं।

:

function detect(URL, callback) { 
    var image = new Image(); 
    image.src = URL; 
    image.onload = function() { 
    var result = [{ x: 45, y: 56 }]; 
    callback(result); 
    }; 
} 

आप एक कॉलबैक, जो एक बार मूल्य उपलब्ध है बुलाया जाएगा साथ detect फ़ंक्शन को कॉल करें:

एक इस तरह अतुल्यकालिक परिदृश्यों से निपटने में आम तरीका है, एक कॉलबैक फ़ंक्शन का उपयोग करने के लिए है

detect('image.png', function(result){ 
    alert(result); 
}); 
+0

हाँ, कॉलबैक बेहतर तरीके इस संभाल करने में से एक होगा। –

+0

हाय, यह 'async/await' बजाय' callback' समारोह का उपयोग करने के लिए संभव है? मैं अपने कोड में यह कोशिश की, लेकिन एक त्रुटि कह 'Uncaught (वादा में) त्रुटि मिल गया है: लेखन त्रुटि: कॉलबैक एक function' नहीं है। त्रुटि फेंक दी गई है क्योंकि जब मैं अपना फ़ंक्शन कॉल करता हूं तो मैं 'कॉलबैक' निर्दिष्ट नहीं करता हूं लेकिन केवल 'कॉन्स्ट एक्स = डिटेक्ट (यूआरएल)' है (मैं सिर्फ स्पष्टीकरण के लिए 'डिटेक्ट फ़ंक्शन का उपयोग कर रहा हूं) –

+0

@IvanPrizov:' async/प्रतीक्षा करें 'दृष्टिकोण बहुत नया है, इसलिए यह पुराने ब्राउज़र में समर्थित नहीं है। मैं नहीं बल्कि सुझाव है कि आप समारोह से एक वादा वापसी अगर आप एक कॉलबैक फ़ंक्शन में भेजने के लिए नहीं करना चाहती। – Guffa

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