2011-08-25 20 views
14

Moje pytanie dotyczy Javascript. Mam funkcję oddzwaniania, która odbiera obiekt położenia po pomyślnym wywołaniu zwrotnym.JavaScript przypisywanie zwracanej wartości funkcji oddzwaniania do zmiennej globalnej

Problem polega na tym, że kiedy próbuję ustawić właściwości obiektu położenia na zmienną globalną przy udanym wywołaniu zwrotnym, po prostu nie pozwala mi tego zrobić, a globalne pozostaje nieokreślone.

Zamiast tego, zamiast bezpośrednio ustawiać właściwości obiektu na zmienne globalne, próbuję zwrócić je za pomocą funkcji wywołania zwrotnego, ale nie mogłem znaleźć sposobu, aby ustawić wartość zwracaną przez funkcję wywołania zwrotnego na globalną. zmienna.

Oto uproszczony kod.

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'); 
} 

Odpowiedz

15

Nie można zwrócić wartości z wywołania zwrotnego (w tym przypadku). Oznaczałoby to, że wewnątrz wartości getCurrentPosition musi zostać gdzieś przypisana wartość zwracana z wywołania zwrotnego.

Przypisanie jej do zmiennej globalnej działa, ale w momencie uzyskania dostępu do tej zmiennej nie została jeszcze przypisana nowa wartość. Na przykład.

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

Pomyślcie o tym: getCurrentPosition jest prawdopodobnie robi żądania Ajax, aby uzyskać pozycję. Takie żądanie zajmuje (a) czas (kilka milisekund) iz tego powodu (b) jest asynchroniczny, co oznacza, że ​​JavaScript nie czeka na odpowiedź aż do otrzymania odpowiedzi. Twój kod jest szybszy sposób. onSuccess nie został jeszcze wywołany, gdy wyświetli się ostrzeżenie x.

jedynym rozwiązaniem:

cały kod, który musi otworzyć pozycję być albo wywołana z zwrotnego.

+0

rzeczywiście dobry punkt, moja odpowiedź jest głupie niedopatrzenie z mojej strony. kod nie jest liniowy, więc musisz zrobić to, co chcesz zrobić ze współrzędnymi wywołania zwrotnego, aby upewnić się, że wartość została powiązana. – WickyNilliams

+0

Masz rację. Funkcja getCurrentPosition próbuje uzyskać geolokalizację, która jest asynchroniczna dlatego gdy próbuję uzyskać do niego dostęp ze zmiennej globalnej, prawdopodobnie nie jest ona ustawiana i zwracana undefined.Isnt czy istnieje sposób przypisania zmiennej do wartości zwracanej po wykonaniu funkcji asynchronicznej z jej zadaniem? –

+0

@Torukojin: Nie, gdzie należy zwrócić wartość? Jak już wspomniano, kod działa asynchronicznie. Z tego powodu wartość jest przekazywana jako parametr do funkcji wywołania zwrotnego, dzięki czemu można z niej korzystać i robić, co tylko zechce. Gdyby można było "zwrócić" wartość, to zrobiłby to "getCurrentPosition". Ale tak nie jest, dlatego zapewniasz oddzwonienie. Może znajdziesz [tego artykułu] (http://felix-kling.de/blog/2011/01/14/how-to-return-data-from-an-ajax-call/) pomocne w zrozumieniu problemu (ale nie jestem tak dobry w pisaniu;)) –

0

Czy próbowałeś ustawić go za pomocą globalnego obiektu 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 

} 

również, ponieważ zwracasz współrzędne z modułu obsługi sukcesu, czy nie ma innego sposobu na uzyskanie tej wartości?

0

umieścić console.log(x); tuż po x=cords sprawdzić wartość (działa w Chrome i FF z FireBug)

zrobić również zaraz po wezwaniu onSuccess.

Nie zapominaj także, że istnieje kod asynchroniczny w JS (jeśli używasz AJAX, aby uzyskać pozycję), a może po prostu nie otrzymać odpowiedź podczas sprawdzania wartości x

+0

Właściwie już to robię, ale nie wspomniałem :) –

1

Jak opisał Felix King, nie możesz zwrócić wartości z wywołania zwrotnego iw wariancie zmiennej globalnej zmienna nie zostanie ustawiona, dopóki nie zakończy się żądanie AJAX i nie zadzwoni na oddzwonienie (stąd jego nazwa!).

Używając zmiennej globalnej, możesz rozwiązać swój problem, jeśli masz jakąś pętlę przetwarzania, możesz dodać ten kod do tej pętli, aby zrobić to, co jest wymagane, gdy zmienia się współrzędna.

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

można zaimplementować metodę pomocnika jak płynący:

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 
     }); 
    } 

    }; 
Powiązane problemy