2012-10-30 20 views
5

से वैरिएबल प्राप्त करें I जावास्क्रिप्ट में कोई पेशेवर नहीं है और मैंने इंटरनेट पर इसके लिए काफी समय खोजा है।जावास्क्रिप्ट फंक्शन

मुझे किसी अन्य फ़ंक्शन से एक चर प्राप्त करने में समस्या हो रही है। मेरे कोड इस तरह देख रहा है:

var variabeltje; 
$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()}, 
    function(data) { 
    alert(data); 
    variabeltje=data; 
    } 
); 
alert(window.variabeltje); 

चर variabeltje डेटा से जानकारी प्राप्त करना होगा। जब मैं variabeltje=data से नीचे चेतावनी डालता हूं तो यह काम कर रहा है, लेकिन मुझे फ़ंक्शन के बाद डेटा चर की आवश्यकता है।

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

मैं लोगों ने क्या कहा करने के लिए इसे बदल दिया है, मैं अब इस राशि:

   var XHR = $.post('js/ajax/handle_time.php', {time: $(this).find('input').val()}); 
       XHR.done(function(data) { 
        console.log(data); 
        getData(data); 
       }); 

       function getData(data) { 
       if(data == 'true') { 
        alert(data); 
        $(this).unbind('keypress'); 
        $(this).html($(this).find('input').val()); 
       } 
       } 

लेकिन अब $ (this) समारोह में गुजर नहीं है। इसे कैसे हल किया जा सकता है?

+0

कारण है कि उत्तर से नीचे दी गई है, लेकिन आप क्या करने की कोशिश कर रहे हैं के रूप में कोई समाधान नहीं। ऐसा इसलिए है क्योंकि ऐसा करने के लिए आप क्या करना चाहते हैं इसके बारे में अधिक जानकारी के बिना ऐसा करना मुश्किल है। उदाहरण के लिए, इस कोड में समस्या को ठीक करने का एक अच्छा तरीका है चेतावनी को दो पंक्तियों में ले जाना, लेकिन यह आपके वास्तविक कोड में बहुत अच्छी तरह से काम नहीं कर सकता है। – Jasper

+0

आपके उत्तर के लिए धन्यवाद। फ़ाइल handle_time.php में मैं सत्यापन की जांच कर रहा हूं और इसे डेटाबेस में संपादित किया जाएगा। अगर इसे सफलतापूर्वक संपादित किया गया है तो यह सच हो जाएगा; और variabeltje मूल्य को सही प्राप्त करना है। फिर अलर्ट के बाद मैं यह जांचना चाहता हूं कि यह सच है या नहीं और चीजों को प्रदर्शित करता है या नहीं। – Marnix

+0

ठीक है, तो मुझे लगता है कि आपको '$। पोस्ट()' कॉल के नीचे ऐसा करने की कोशिश नहीं करनी चाहिए (अनुरोध के बाद सही * भेजा गया है) इसके बजाय, आपको इसे उस समारोह के अंदर करना चाहिए जिसे आप पास करते हैं ' अनुरोध के पूरा होने के बाद $ .post() 'निष्पादित किया जाएगा। – Jasper

उत्तर

3

यह अतुल्यकालिक है के रूप में डेटा केवल उपलब्ध हो जाएगा ajax कॉल पूर्ण होने के बाद, तो आप उस के साथ काम करते हैं और बाद ajax करने के लिए किया जाता है जब तक प्रतीक्षा करने के लिए अपने कोड को संशोधित करना होगा अपने सामान:

var XHR = $.post('js/ajax/handle_time.php', {time: $(this).find('input').val()}); 

XHR.done(function(data) { 
    console.log(data); 
}); 

या अन्य समारोह में:

function XHR(time){ 
    return $.post('js/ajax/handle_time.php', {time: time}); 
} 

function doStuff(element) { 
    XHR($(element).find('input').val()).done(function(data) { 
     console.log(data); 
    }); 
} 

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

आपके संपादन के आधार है, ऐसा लगता है कि यह एक scoping मुद्दा है की तरह:

var self = this, 
    XHR = $.post('js/ajax/handle_time.php', {time: $(self).find('input').val()}); 

XHR.done(function(data) { 
    console.log(data); 
    getData(data); 
}); 

function getData(data) { 
    if(data == 'true') { //normally you'd try to pass true as a boolean, not string 
     alert(data); 
     $(self).unbind('keypress').html($(self).find('input').val()); 
    } 
} 
+0

बहुत बहुत धन्यवाद। बस एक और सवाल, जब मैं इसे फ़ंक्शन में डालता हूं: $ (यह) .html ($ (this)। ढूँढें ('इनपुट')।वैल()); मैं $ (यह) को XHR.done (फ़ंक्शन (डेटा) {? – Marnix

+0

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

+0

मैंने इसे बदल दिया और मैंने पहली पोस्ट संपादित की है। – Marnix

1

समस्या यह है कि post विधि को अतुल्यकालिक रूप से निष्पादित किया जाता है। यह है, एक पोस्ट सर्वर पर भेजी जाती है लेकिन निष्पादन प्रवाह जारी रहता है, इसलिए आपकी अलर्ट उस मान तक पहुंचने का प्रयास कर रही है जो सेट नहीं किया गया था क्योंकि पोस्ट अभी तक वापस नहीं आया है।

यदि आपको सिंक्रोनिक निष्पादन की आवश्यकता है तो आप ajax विधि का उपयोग कर सकते हैं।

2

ऐसा इसलिए है क्योंकि $। पोस्ट विधि असीमित रूप से चलती है।

कृपया SO पर this question पर एक नज़र डालें।

संपादित करें: आप अपना कोड बदल सकते हैं और सफलतापूर्वक ट्रिगर किए गए अज्ञात फ़ंक्शन के शरीर के अंदर पोस्ट विधि के बाद भाग डाल सकते हैं। इस प्रकार है:

$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()}, 
    function(data) { 
    alert(data); 
    variabeltje=data; 
    alert(window.variabeltje); // or whatever function you need to call, call it here... 
    } 
); 
संबंधित मुद्दे