2013-02-28 2 views
2

먼저 죄송합니다. 이 질문이 너무 많아서 알려드립니다. 나는 그 중 많은 것을 읽었지만 대답을 얻을 수 없었다.);jQuery 지연된 작품은 Google 지오 코드가 잘못되었습니다

Google지도로 웹 앱을 만들고 있습니다.

은 내가

하지만 잠시 인터넷 검색 후

가, 지금은 자바 스크립트가되지 않는다는 것을 이해하고, 비동기 지오() 완료 기능을 기다리는 '대기'또는 자바 스크립트의 '수면'기능의 종류를 사용하고 싶었 그들 중 하나를 가지고 있고, jQuery를 사용하여 지연시켜야합니다.

(내가 jQuery를 1.8.3을 사용하고 구글 크롬 브라우저를 테스트하고 있습니다)

그래서 나는 이런 내 코드를 작성,하지만 작동하지 않습니다.

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 ' [개체 개체] (경고 2) -> 4. '해결'보류 '(경고 3) 가 해결 될 때까지 연기가 내 코드가 대기하므로,

하지만 내가 본 것은 1입니다' (경보 1) -> 2. 2. '널 (경보 2) -> 3.'보류 중 '(경보 3) -> 주소 (콜백의 알림)

해결되거나 거부 될 때까지 기다리지 않은 이유는 무엇입니까?

then() 대신 done() 및 always()를 시도했지만 모두 실패했습니다.

이 문제가 일주일 동안 저를 차단하고 ... 사전에

감사합니다!

답변

2

지연에 대한 작업 방법을 완전히 알지 못하는 것 같습니다.

promise에 대해 example from the doc을 살펴보십시오. 지연을 사용하면 실제 값을 반환하지 않지만 지연을 사용하여 반환 할 수 있습니다.

따라서 point을 반환하는 대신 deferred.promise()을 반환해야합니다. 그런 다음 지연이 성공적이거나 실패한 경우 $.when()을 사용하여 콜백을 실행할 수 있습니다. 성공 또는 실패한 값에 액세스하려면 원하는 매개 변수를 appripriate 함수에 전달해야합니다. 지연을 해결하거나 거절하면 이제 deferred.resolve(point) 값으로 처리합니다. 그래서 포인트를 액세스하기 위해이 같은 작업을 수행 할 수 있습니다

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

당신의 대답은 완벽한 일 (무엇에 geocode() 교체는 promise() 반환)! 얼마나 어리석은 지 .. 친절한 답변을 해주셔서 고맙습니다. – user2106764