2012-07-31 12 views
19

मैं एक समारोह है कि एक कॉलबैक की जानकारी के साथ एक ऑब्जेक्ट बनाने के लिए कोशिश कर रहा हूँ के लिए प्रतीक्षा करें:कॉलबैक जावास्क्रिप्ट में

var geoloc; 

var successful = function (position) { 
    geoloc = { 
     longitude: position.coords.longitude, 
     latitude: position.coords.latitude 
    }; 
}; 

var getLocation = function() { 
    navigator.geolocation.getCurrentPosition(successful, function() { 
     alert("fail"); 
    }); 

    return geoloc; 
}; 

मैं यह कैसे कर सकते हैं? getLocation फ़ंक्शन successful से पहले शून्य मान वापस निष्पादित किया गया है।

धन्यवाद!

+0

आपके पास 'getLocation' में बहुत अधिक'} 'है। –

+0

संपादित, धन्यवाद! – palvarez89

+3

आपके पास 'सफल' में बहुत अधिक 'l' है और बहुत कम है ...;) –

उत्तर

25

कॉलबैक का उपयोग किया जाता है क्योंकि फ़ंक्शन असीमित है। कॉलबैक भविष्य में किसी बिंदु पर चलता है।

तो, हाँ getLocation कॉलबैक ट्रिगर होने से पहले लौटाता है। इस तरह एसिंक्रोनस विधियां काम करती हैं।

आप कॉलबैक की प्रतीक्षा नहीं कर सकते हैं, ऐसा नहीं है कि यह कैसे काम करता है। आप getLocation पर कॉलबैक जोड़ सकते हैं, जो इसे पूरा होने के बाद चलता है।

var getLocation = function(callback){ 
    navigator.geolocation.getCurrentPosition(function(pos){ 
     succesfull(pos); 
     typeof callback === 'function' && callback(geoloc); 
    }, function(){ 
     alert("fail"); 
    }); 
}; 

अब बजाय var x = getLocation() कर रहे हैं और एक वापसी मान की उम्मीद की है, तो आप इसे इस तरह कहते हैं:

getLocation(function(pos){ 
    console.log(pos.longitude, pos.latitude); 
}); 
+0

यह बहुत रोचक है! उदाहरण महान काम करता है और मेरे प्रोजेक्ट के लिए बिल्कुल सही है। मुझे जावास्क्रिप्ट सीखने में मदद करने के लिए धन्यवाद। – palvarez89

+0

आपका स्वागत है, दोस्त! खुशी है कि मैं मदद कर सकता हूं :-) –

+0

इस उत्तर पर ठोकर खाई, मैं websockets का उपयोग कर स्थान डेटा स्ट्रीम करने की कोशिश कर रहा हूं और यह मुझे ट्रिप कर रहा था। यह निश्चित रूप से सही दिशाओं में एक कदम है, क्या मुझे कुछ और ध्यान रखना चाहिए, क्योंकि मैं उपरोक्त को 'सेटटाइमआउट' या 'सेट इंटरवल' के साथ उपरोक्त करने की कोशिश कर रहा हूं ताकि प्रत्येक 'एक्स' सेकंड स्थान डेटा भेजा जा सके। क्या यह एक सलाहकार दृष्टिकोण है? –

20

मैं रॉकेट के जवाब में दृष्टिकोण की सिफारिश करेंगे। हालांकि, अगर आप वास्तव में चाहते थे, तो आप अपने शेष कोड को ट्रिगर कर सकते हैं जब getLocation एक jQuery स्थगित ऑब्जेक्ट का उपयोग करके समाप्त होता है। getCurrentPosition द्वारा प्रदान किए गए कॉलबैक का उपयोग करने से यह आपको अधिक बढ़िया नियंत्रण देगा।

// create a new deferred object 
var deferred = $.Deferred(); 

var success = function (position) { 
    // resolve the deferred with your object as the data 
    deferred.resolve({ 
     longitude: position.coords.longitude, 
     latitude: position.coords.latitude 
    }); 
}; 

var fail = function() { 
    // reject the deferred with an error message 
    deferred.reject('failed!'); 
}; 

var getLocation = function() { 
    navigator.geolocation.getCurrentPosition(success, fail); 

    return deferred.promise(); // return a promise 
}; 

// then you would use it like this: 
getLocation().then(
    function (location) { 
     // success, location is the object you passed to resolve 
    }, 
    function (errorMessage) { 
     // fail, errorMessage is the string you passed to reject 
    }); 
+2

मैंने वास्तव में कभी भी 'deferred' से गड़बड़ नहीं की है, लेकिन यह बहुत साफ दिखता है। +1 –

+18

@ रॉकेट मैंने कल इसके साथ गड़बड़ करना शुरू कर दिया है, इसलिए अब मैं हर सवाल को नाखून की तरह देखने की कोशिश कर रहा हूं ताकि मैं अपने नए हथौड़ा का उपयोग कर सकूं: पी – jbabey

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