2016-01-03 30 views
-2

我試圖將我的位置作爲Ajax請求發送。
可能是由於地理定位的異步調用,它不能按預期工作。 地理定位的功能在我的外部功能之後被調用,導致data is empty的答案。地理定位異步調用的問題

$(document).ready(function() { 
    $("button").click(function() { 

     var data = ""; 

     if (...) { // if user wants to share their location 
      function geo_success(position) { 
       console.info("lat:" + position.coords.latitude + " Lot: " + position.coords.longitude); 
       data = { 
        lat : position.coords.latitude, 
        lon : position.coords.longitude 
       }; 
      } 

      function geo_error() { 
       alert("No position available."); 
      } 

      var geo_options = { 
       enableHighAccuracy : true, 
       timeout : 1000, 
       maximumAge : 0 
      }; 

      navigator.geolocation.getCurrentPosition(geo_success, geo_error, geo_options); 
     } 
     if (...) { // if user doesn't want to share their location 
      data = { 
       a : "abc", // some other data 
       b : "def" 
      }; 
     } 
     if (...) { // maybe a third option 
      data = { 
       b : "test", // some other data 
       c : "some data" 
      }; 
     } 

     if (Object.keys(data).length > 0) { 
      console.info("hier"); 
      $.ajax({ 
       method : "GET", 
       url : "test.php", 
       data : data, // finaly send data 
       dataType : 'json', 
       success : function(data) { 
        console.log(data) 
       }, 
       error : function(data) { 
        console.error(data); 
       } 
      }); 
     } else { 
      console.error("data is empty"); 
     } 
    }); 
}); 

<input type="checkbox" id="box1" /> 
<button>ok</button> 

我不能把Ajax請求的geo_success,因爲要首先定義data需求。在我的原始代碼中(這裏只是一個摘錄),根據用戶的選擇,有幾種可能的data
所以我只想要1個Ajax請求。

什麼可能是一種可能的補救措施?

+0

*「我無法將Ajax請求放入geo_success中,因爲我需要首先定義數據。」* - 我無法看到這兩件事情是如何相關的。 – JJJ

+0

設置'data'後,將ajax放入geo_success中 –

+0

創建'promise',它將在'geo_success'中解析並在'geo_error'中被拒絕。然後在'.then'或'.catch'中建立你的邏輯。 –

回答

0

可能是由於地理定位的異步調用,它不能按預期工作。地理定位的功能是在我的外部函數之後調用的,導致數據是空的答案。

所以你的意思是這是一個異步調用?:

navigator.geolocation.getCurrentPosition(geo_success, geo_error, geo_options); 

如果是這樣的話,那麼我懷疑你可以用回撥功能,它提供當操作完成後執行。而且......它看起來像你已經這樣做......

​​

所以如果你需要應對的異步操作的結果,只是把代碼中的回調函數。

異步就意味着... 不是同步。在完成異步操作後需要發生的任何事情需要調用該操作完成。在你的情況下,當你檢查它時,data將永遠爲空,因爲當你創建它時顯式地將它設置爲空字符串,並且當時沒有其他更新。

+0

那麼有什麼解決方案? – user1170330

+0

@ user1170330:我提出的解決方案不是以某種方式工作嗎? – David

+0

如果我理解你是對的,你只是在描述問題。我錯過了你的解決方案嗎? – user1170330