2011-08-25 21 views
14

पर कॉलबैक फ़ंक्शन का रिटर्न मान असाइन करना मेरा प्रश्न जावास्क्रिप्ट के बारे में है। मेरे पास एक कॉलबैक फ़ंक्शन है जो सफल कॉलबैक पर स्थिति ऑब्जेक्ट प्राप्त करता है।जावास्क्रिप्ट वैश्विक चर

समस्या यह सिर्फ मुझे इसे करते हैं कि जब मैं एक सफल कॉलबैक पर एक वैश्विक चर के लिए स्थिति ऑब्जेक्ट के गुणों को सेट करने का प्रयास करता है और वैश्विक बस अपरिभाषित रहता है।

ऑब्जेक्ट गुणों को वैश्विक चरों पर सीधे सेट करने के बजाय इसके कामकाज के रूप में मैं कॉलबैक फ़ंक्शन के माध्यम से इसे वापस करने का प्रयास कर रहा हूं लेकिन मुझे कॉलबैक फ़ंक्शन के वापसी मूल्य को वैश्विक रूप से सेट करने का कोई तरीका नहीं मिला चर।

यहाँ सरलीकृत कोड है।

var x; 

navigator.geolocation.getCurrentPosition(onSuccess, onError); 

//on Successful callback receives a Position Object 
function onSuccess(position) { 
    var coords = position.coords; 
    x=coords;  // Setting directly to an object does not work x still remains undefined after succesful callback    
return coord; // Trying to set this to a global object 

} 

// onError Callback receives a PositionError object 
// 
function onError(error) { 
    alert('code: ' + error.code + '\n' + 
      'message: ' + error.message + '\n'); 
} 

उत्तर

15

आप कॉलबैक (इस मामले में) से कोई मूल्य वापस नहीं कर सकते हैं। इसका मतलब यह होगा कि getCurrentPosition के अंदर, कॉलबैक से वापसी मूल्य कहीं भी असाइन किया जाना चाहिए।

एक वैश्विक चर कार्यों के लिए यह नियत है, लेकिन समय में आप का उपयोग कि चर, यह अभी तक नया मान नहीं सौंपा गया था। जैसे

// x is assigned in `onSuccess` 
var x; 
navigator.geolocation.getCurrentPosition(onSuccess, onError); 
alert(x); // will be undefined, the response is not processed yet 

इसके बारे में सोचो: getCurrentPosition शायद स्थिति प्राप्त करने के लिए एक Ajax अनुरोध कर रही है। इस तरह के एक अनुरोध (क) समय (मिलीसेकेंड की जोड़ी) लेता है और उसकी वजह से (ख) अतुल्यकालिक, जिसका अर्थ है कि जावास्क्रिप्ट इंतजार नहीं करता जब तक प्रतिक्रिया प्राप्त किया जाता है। आपका कोड रास्ता तेज है। onSuccess को अभी तक कॉल नहीं किया गया था जब आप x को अलर्ट करते हैं।

केवल समाधान:

सभी कोड स्थिति में हो या कॉलबैक से कहा जाता है के रूप में उपयोग करने के लिए है।

+0

वास्तव में अच्छा बिंदु, मेरा जवाब मेरे हिस्से पर एक बेवकूफ निरीक्षण है। कोड रैखिक नहीं है, इसलिए कॉलबैक में कॉर्ड के साथ जो कुछ भी करना है, उसे करने के लिए आपको – WickyNilliams

+0

बाध्य किया गया है, यह सुनिश्चित करने के लिए कि आप वास्तव में सही हैं। GetCurrentPosition फ़ंक्शन भौगोलिक स्थान प्राप्त करने का प्रयास कर रहा है जो असीमित है यही कारण है कि जब मैं इसे ग्लोबल वैरिएबल से एक्सेस करने का प्रयास करता हूं तो शायद यह सेट नहीं होता है और अपरिभाषित नहीं होता है। क्या एसिंक फ़ंक्शन के काम के बाद वैरिएबल को वापस करने के लिए वैरिएबल को असाइन करने का कोई तरीका नहीं है? –

+0

@ टोरुकोजिन: नहीं, मूल्य को कहां वापस किया जाना चाहिए? जैसा कि कहा गया है, कोड असीमित रूप से चलाता है। यही कारण है कि कॉल कॉलबैक फ़ंक्शन के पैरामीटर के रूप में पारित किया जाता है ताकि आप इसका उपयोग कर सकें और जो भी चाहें कर सकें। यदि मूल्य को वापस करने के लिए संभव था, तो 'getCurrentPosition' इसे करेगा। लेकिन ऐसा नहीं है, इसलिए आपने कॉलबैक प्रदान किया है। हो सकता है कि आपको [यह आलेख] मिलेगा (http://felix-kling.de/blog/2011/01/14/how-to-return-data-from-an-ajax-call/) समस्या को समझने में सहायक (लेकिन मैं लिखित में अच्छा नहीं हूं;)) –

0

आप वैश्विक window वस्तु के माध्यम से इसे स्थापित करने की कोशिश की है?

//on Successful callback receives a Position Object 
function onSuccess(position) { 
    var coords = position.coords; 
    window.x=coords;  // Setting directly to an object does not work x still remains undefined after succesful callback    
return coord; // Trying to set this to a global object 

} 

भी, चूंकि आप सफलता हैंडलर से निर्देशांक वापस लौटते हैं, तो क्या इस मूल्य को पाने का कोई और तरीका नहीं है?

0

मूल्य (Firebug के साथ क्रोम और एफएफ पर काम करता है)

जाँच करने के लिए करते हैं कि सिर्फ x=cords के बाद एक console.log(x); डाल भी सिर्फ onSuccess की कॉल के बाद।

भी भूल नहीं है वहाँ जे एस में एसिंक्रोनस कोड है कि (यदि आप स्थिति पाने के लिए AJAX का उपयोग करें), शायद तुम सिर्फ ने वर्णन किया है जब आप x

+0

वास्तव में मैं पहले से ही ऐसा कर रहा हूं हालांकि मैंने उल्लेख नहीं किया :) –

1

के मान की जाँच उत्तर प्राप्त नहीं है फ़ेलिक्स किंग, आप कॉलबैक से और अपने ग्लोबल वैरिएबल वेरिएंट में कोई मान वापस नहीं कर सकते हैं, वेरिएबल तब तक सेट नहीं किया जाएगा जब तक AJAX अनुरोध पूरा नहीं हो जाता है और कॉलबैक (इसलिए इसका नाम!) कॉल करता है।

एक वैश्विक चर का उपयोग करता है, तो आप प्रसंस्करण पाश न किसी तरह का आप अपनी समस्या को हल कर सकते हैं, तुम क्या आवश्यकता है जब भी coord परिवर्तन करने के लिए है कि पाश के लिए इस कोड जोड़ सकते हैं।

if (coord) // global variable has a new value 
    // process it 
    alert('code: ' + error.code + '\n' + 
      'message: ' + error.message + '\n'); 
    // then clear it 
    coord = null; 
    } 
0

आप बह रही है की तरह एक सहायक विधि को लागू कर सकते हैं:

var LocationHelper = function() {}; 

LocationHelper.prototype.getLocation = function(callback) { 

    navigator.geolocation.getCurrentPosition(onSuccess, onError); 

    function onSuccess(pos) { 
     callback({ 
      pos: pos 
     }); 
    } 

    function onError(message) { 
     callback({ 
      message: message 
     }); 
    } 

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