2010-06-07 9 views
26

मैं Google मानचित्र एपीआई के साथ काम कर रहा हूं और जब भी मैं वैरिएबल को codeLatLng फ़ंक्शन से प्रारंभिक फ़ंक्शन में वापस कर देता हूं, तो यह अनिर्धारित दावा करता है। यदि मैं codeLatLng से चर मुद्रित करता हूं तो यह ठीक दिखाई देता है।मैं Google मानचित्र जावास्क्रिप्ट geocoder कॉलबैक से एक चर कैसे वापस कर सकता हूँ?

var geocoder; 
    function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    var addr = codeLatLng(); 
    document.write(addr); 

    } 

    function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       return results[1].formatted_address; 
      } else { 
      alert("No results found"); 
      } 
     } else { 
      alert("Geocoder failed due to: " + status); 
     } 
     }); 
    } 
    } 

प्रिंट बाहर अपरिभाषित

अगर मैं कार्य करें:

var geocoder; 
    function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    codeLatLng(); 


    } 

    function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       document.write(results[1].formatted_address); 
      } else { 
      alert("No results found"); 
      } 
     } else { 
      alert("Geocoder failed due to: " + status); 
     } 
     }); 
    } 
    } 

न्यूयॉर्क, एनवाई 10012 बाहर प्रिंट, संयुक्त राज्य अमेरिका

उत्तर

44

आप समारोह से मान नहीं कर सकते हैं, मूल्य अभी तक जब अस्तित्व में नहीं है समारोह रिटर्न।

geocode विधि एक एसिंक्रोनस कॉल करता है और परिणाम को संभालने के लिए एक कॉलबैक का उपयोग करता है, तो आप codeLatLng समारोह में भी ऐसा ही करने के लिए है:

var geocoder; 
function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    codeLatLng(function(addr){ 
    alert(addr); 
    }); 
} 

function codeLatLng(callback) { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
    geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     if (results[1]) { 
      callback(results[1].formatted_address); 
     } else { 
      alert("No results found"); 
     } 
     } else { 
     alert("Geocoder failed due to: " + status); 
     } 
    }); 
    } 
} 
+0

यह है addr के मूल्य वापस करने के लिए संभव है? मैं एक चर के लिए addr असाइन कैसे करना चाहिए? – AbtPst

+0

@AbtPst: परिणामस्वरूप आप परिणाम से कुछ भी वापस नहीं कर सकते हैं, क्योंकि परिणाम होने से पहले कॉल रिटर्न देता है। जहां मैंने 'अलर्ट (एडीआर) रखा; 'वह जगह है जहां आप परिणाम का उपयोग कर सकते हैं।मूल्य को वैश्विक वैरिएबल को असाइन करना संभव है, लेकिन फिर भी आपको मूल्य आने के लिए इंतजार करना होगा। – Guffa

+0

हाँ, यह ठीक होगा। असल में मेरे पास लम्बे लंबे मूल्यों की एक सरणी है। मैं सरणी को सरलीकृत रूप से संसाधित करना चाहता हूं और एक सूची में पता जोड़ना चाहता हूं। वैसे, क्या एक बार में लेट लोन मानों की एक सरणी geocode रिवर्स करने का कोई तरीका है? और मैं ग्लोबल वैरिएबल में एडीआर कैसे आवंटित करूं? क्या मैं सिर्फ फ़ंक्शन के अंदर x = addr कर सकता हूं? – AbtPst

-2

कि वापसी codeLatLng से लौट नहीं है; यह अज्ञात फ़ंक्शन से geocoder.geocode पर लौट रहा है।

मुझे लगता है कि आपको किसी अन्य तंत्र का उपयोग करके डेटा पास करने की आवश्यकता होगी उदा। एक वैश्विक चर

0

codeLatLng() फ़ंक्शन के पैरामीटर के रूप में geocoder पास करें।

function codeLatLng(geocoder) { 

तो जैसे कॉल यह आपके इनिशियलाइज़ समारोह में:

var addr = codeLatLng(geocoder); 
11

आप एक अतुल्यकालिक अनुरोध कर रहे हैं, अपने codeLatLng() समारोह समाप्त हो गया और इससे पहले कि जियोकोडर किया जाता है लंबे समय से वापस आ गया है।

क्या आप जारी रखना जियोकोडर डेटा की जरूरत है, तो आप श्रृंखला के लिए अपने कार्यों को एक साथ होगा:

function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    codeLatLng(); 
} 
function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
        if (results[1]) { 
         initContinued(results[1].formatted_address); 
        } else { 
         alert("No results found"); 
        } 
       } else { 
        alert("Geocoder failed due to: " + status); 
       } 
     }); 
     } 

} 
function initContinued(addr) { 
    alert(addr); 
} 
1

geocode समारोह एक कॉलबैक (function(results, status) { ... }) का उपयोग करता है जो कहा जाता है कि geocode फ़ंक्शन उसके काम को समाप्त करता है। इसलिए, जब आप इस कॉलबैक से कोई मान वापस करते हैं, तो यह केवल geocode फ़ंक्शन पर लौटाता है, codeLatLng से बाहर नहीं।

इस के साथ आप कई विकल्प हैं:, codeLatLng में एक चर को परिभाषित करना और कॉलबैक फ़ंक्शन में सेट उदाहरण के लिए:

function codeLatLng() 
{ 
    var returnValue; 
    geocoder.geocode({'latLng': latlng}, function(results, status) { returnValue = results[1].formatted_address }); 
    return returnValue; 
} 

या सामान आप कॉलबैक फ़ंक्शन में सीधे परिणाम के साथ की जरूरत है। या परिणाम को वैश्विक चर में डाल दें। (इसके अलावा, geocode समारोह अतुल्यकालिक है अगर - अगर यह तुरंत वापस आती है और कॉलबैक बाद में कहा जाता है, आप पिछले दो में से एक करने की ज़रूरत है, तो आप उस मामले में codeLatLng से मूल्य वापस नहीं कर सकते हैं।)

+1

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

+0

यही कारण है कि मैंने कहा कि यदि जियोकोड असीमित है (मुझे नहीं पता था कि यह था) तो उसे अन्य दो विधियों, वैश्विक चर या कॉलबैक में सामान का उपयोग करना चाहिए। हालांकि मैं मानता हूं कि मैंने यह नहीं बताया कि वैश्विक चर के साथ उन्हें कोई संकेत नहीं मिलेगा, इसलिए उन्हें समय-समय पर इसकी जांच करनी होगी। –

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