2012-10-22 103 views
2

我想從客戶端獲取地理位置,然後爲每個Ajax加載位置,然後將它們顯示到列表中。嵌套異步函數

我有函數getGeolocation,loadLocationcreateList

getGeolocationloadLocation是異步函數,所以我需要回調或使用延遲對象。我在互聯網上搜索了幾個小時,但我仍然不明白如何處理這個問題的語法。

我知道這將是可以調用的函數successloadLocationscreateListafterResponse功能,但我想調用這個函數在幾個地方,所以它不是一個適合我的選擇。

var lat = 0; 
var long = 0; 
var locations; 

getGeolocation(); 
loadLocations(); 
createList(); 

    $('#map').live("pageshow", function() {  
     google.maps.event.trigger(map, 'resize'); 
    }); 

function getGeolocation(){  
    console.log("getGeolocation"); 
    if (navigator.geolocation) { 

      // getCurrentPosition ruft die Funktion success auf und übermittelt die Position Werte 
      // error wird ausgeführt wenn es einen Fehler beim ermitteln der Position gibt 
     navigator.geolocation.getCurrentPosition(success, error); 
    } else { 
     alert("GeoLocation API ist NICHT verfügbar!"); 
    } 

} 

function success(position) {  
    console.log("success"); 
    lat = position.coords.latitude; 
    long = position.coords.longitude; 
} 

function error(msg) {  
    console.log(typeof msg == 'string' ? msg : "error"); 
} 


function loadLocations(){  
    console.log("loadLocations"); 
    return $.ajax({ 
     type: "GET", 
     url: "http://www.example.at/api/getLocationsByGeodata_JSON", 
     success: afterResponse, 
     /*beforeSend: showPreloader,*/ 
     data: {lat : lat, long: long}, 
     dataType: 'json' 
    }); 
} 

function afterResponse(response_objekt) {  
    console.log("afterResponse"); 
    console.log(response_objekt['results']); 
    locations = response_objekt['results']; 
} 
+2

你能解釋一下'我知道這將有可能叫「loadLocations」中的「成功」功能和「afterResponse」函數中的「createList」,但是我想在很多不同的地方調用這個函數,所以它不適合我。需要從許多地方調用哪些方法? –

+0

例如我也有「createMap」函數和一個「showLocation」函數,我想要加載具有相同功能的位置。 – Oachkatzl

+0

所以當你從'createMap()'調用'loadLocations()'時,你不想調用'createList()',它是正確的嗎? –

回答

0

我認爲你可以使用回調函數來實現這一

例如:

var lat = 0; 
var long = 0; 
var locations; 

getGeolocation(function(){ 
    loadLocations().done(function(){ 
     createList(); 
    }); 
}); 

    $('#map').live("pageshow", function() {  
     google.maps.event.trigger(map, 'resize'); 
    }); 

function getGeolocation(successCallback){  
    console.log("getGeolocation"); 
    if (navigator.geolocation) { 

      // getCurrentPosition ruft die Funktion success auf und übermittelt die Position Werte 
      // error wird ausgeführt wenn es einen Fehler beim ermitteln der Position gibt 
     navigator.geolocation.getCurrentPosition(getCurrentPositionCallback(successCallback), error); 
    } else { 
     alert("GeoLocation API ist NICHT verfügbar!"); 
    } 

} 

function getCurrentPositionCallback(callback){ 
    return function (position) {  
     console.log("success"); 

     if(typeof callback == 'function'){ 
      callback(position); 
     } 

     lat = position.coords.latitude; 
     long = position.coords.longitude; 
    }; 
} 

function error(msg) {  
    console.log(typeof msg == 'string' ? msg : "error"); 
} 


function loadLocations(){  
    console.log("loadLocations"); 
    return $.ajax({ 
     type: "GET", 
     url: "http://www.example.at/api/getLocationsByGeodata_JSON", 
     success: afterResponse, 
     /*beforeSend: showPreloader,*/ 
     data: {lat : lat, long: long}, 
     dataType: 'json' 
    }); 
} 

function afterResponse(response_objekt) {  
    console.log("afterResponse"); 
    console.log(response_objekt['results']); 
    locations = response_objekt['results']; 
}