2013-02-28 4 views
2

Прежде всего, я хочу сказать извините, потому что Я знаю так много подобных вопросов к этому. Я читал много из них, но я не мог получить ответ);jQuery отложен неправильно работает с геокодом google

Я создаю веб-приложение с Google Map.

я хотел использовать свой род «ожидания» или функцию «сон» в JavaScript ждать асинхронного геокодирования() функцию до конца,

, но после того, как прибегая к помощи некоторому времени, теперь я понимаю, что Javascript не любой из них, и Я должен использовать jQuery, отложенный для этого.

(я использую JQuery 1.8.3, и тестирование с помощью Google Chrome браузером)

так я написал свой код, как это, но он не работает.

Location.prototype.geocode = function() { 
    deferred = new $.Deferred(); 
    var latLng = this.latLng; 
    var point = null; 

    geocoder.geocode({'latLng': latLng}, 
     function(results, status) { 
      var point = null; 
      if (status == google.maps.GeocoderStatus.OK) { 
       if (results[0]) { 
        alert(results[0].formatted_address); // alert in callback 
        point = get_something_blah_blah_function() /* set return value here */ 
        deferred.resolve(); 
       } else { 
        deferred.reject(); 
        alert('Geocder Error: no result'); 
       } 
      } else { 
       deferred.reject(); 
       alert('Geocoder Error: ' + status); 
      } 
     } 

    ); 

    alert(deferred.state()); // alert 1 
    deferred.then(alert(point)); // alert 2 
    alert(deferred.state()); // alert 3 

    return point; /* return value is set in geocode callback function */ 
} 

я ожидал я увидеть предупреждающие сообщения в этом порядке,

  1. 'в ожидании' (тревога 1) -> 2. адрес точки (предупреждение в обратный вызов) -> 3. ' [объект Object]»(предупреждение 2) -> 4. 'решено' (тревога 3) , потому что мой код будет ждать от отложил до тех пор, пока не будет решен,

но то, что я видел, это 1. 'в ожидании' (предупреждение 1) -> 2. «null» (предупреждение 2) -> 3. «Ожидание» (предупреждение 3) -> адрес (предупреждение при обратном вызове)

Почему он не дождался разрешения или отказался?

Я пробовал это с помощью done() и always() вместо then(), но все не удалось.

эта проблема блокирует меня в течение недели ...

Заранее спасибо!

ответ

2

Кажется, что вы не полностью осознаете, как работать с deferrds.

Взгляните на example from the doc на promise. С deferrds вы никогда не возвращаете фактическое значение, но используйте deferrd, чтобы вернуть его.

Поэтому вместо того, чтобы возвращать point, вам необходимо вернуть deferred.promise(). Затем вы можете использовать $.when() для выполнения обратного вызова, когда deferrd либо был успешным, либо неудачным. Чтобы получить доступ к успешным или неудачным значениям, вам необходимо передать свой желаемый параметр функции appripriate. Вы разрешаете или отклоняете deferrd, теперь делайте это со значениями deferred.resolve(point).

Так что может может сделать что-то подобное для доступа к точке (заменить geocode() с любыми возвращает promise())

$.when(geocode()).then(function(point){ 
    console.log(point); 
}, function() { 
    console.log("the deferred got rejected"); 
}); 
+0

Ваш ответ работал отлично! Как глупо я .. Большое спасибо за ваш добрый ответ. – user2106764

Смежные вопросы