2014-02-07 201 views
3

我陷入了可能非常簡單的事情。返回值爲JavaScript函數

我可以console.log從codeAddress函數的返回值,但我不能讓它返回到調用它的另一個函數。有問題的兩條線被評論發出。

請不要介意我可怕的XX級聯;我只是想弄清函數調用。

任何幫助將不勝感激。謝謝!

function codeAddress(zipCode) { 
    geocoder.geocode({ 'address': zipCode}, function(results, status) { 
     var lat = results[0].geometry.location.d; 
     var lng = results[0].geometry.location.e; 
     var latlng = lat+'XX'+lng; 
     return latlng; // I can console log this value 
    }); 
    } 

var citymap = {}; 
function loadMap() { 
    $.ajax({          
     url: 'getdata.php', 
     data: "query=geolocate", 
     dataType: 'json', 
     success: function (zips) { 
      for (var i in zips) 
      { 
       var entry = zips[i]; 
       citymap[entry['zip_code']]= { 
        scans: entry['num_scans'], 
        position: codeAddress(entry['zip_code']) // But it will never return down here 
       }; 
      } 
     } 
}); 
} 
+2

回調不返回。在回調本身中做你的東西 – dandavis

+1

歡迎來到** async **的精彩世界!你不能那樣做。 – SLaks

回答

1

對於異步函數,您需要提供回調函數,而不是期待返回值。你應該調用「codeAddress」功能是這樣的:

var entry = zips[i]; 
var citymapForZip = { 
    scans: entry['num_scans'], 
}; 
var zipCode = entry['zip_code']; 
citymap[zipCode] = citymapForZip; 
codeAddress(zipCode, getCallbackFunction(citymapForZip)); 

我用一個輔助功能「getCallbackFunction」,這應當能夠給城市地圖的回調函數。回調將簡單地採用地理編碼結果,並設置城市地圖的「位置」屬性。就像這樣:

function getCallbackFunction(citymap) { 
    return function(result) { 
     citymap.position: result; 
    }; 
} 

最後,您codeAddress功能應,而不是返回「經緯度」,它傳遞給回調:

function codeAddress(zipCode, callback) { 
    geocoder.geocode({ 'address': zipCode}, function(results, status) { 
     var lat = results[0].geometry.location.d; 
     var lng = results[0].geometry.location.e; 
     var latlng = lat+'XX'+lng; 
     callback(latlng); 
    }); 
    } 
0

這與範圍有關。

geocoder.geocode({ 'address': zipCode}, function(results, status) { 
     var lat = results[0].geometry.location.d; 
     var lng = results[0].geometry.location.e; 
     var latlng = lat+'XX'+lng; 
     return latlng; // I can console log this value 
    }); 

正在重返codeAddress的範圍,但codeAddress不返回到調用者的範圍。

0

由於調用geocode功能是異步的,你必須使用回調來使用其結果:

function codeAddress(zipCode,cb) { 
    geocoder.geocode({ 'address': zipCode}, function(results, status) { 
     //maybe you want to check status for error condition here 
     var lat = results[0].geometry.location.d; 
     var lng = results[0].geometry.location.e; 
     var latlng = lat+'XX'+lng; 

     cb(zipCode, latLng); 
    }); 
} 

var citymap = {}; 
function loadMap(cb) { 
    $.ajax({          
     url: 'getdata.php', 
     data: "query=geolocate", 
     dataType: 'json', 
     success: function (zips) { 
      var i = 0, 
       l = remaining = zips.length; 

      for (; i <l; i++) //better way to loop an array 
      { 
       var entry = zips[i]; 

       codeAddress(entry['zip_code'], function (zipCode,results){ 
        citymap[zipCode] = { 
         scans: entry['num_scans'], 
         position: results; 
        }; 

        if (--remaining) { 
         cb(); 
        } 
       }); 


      } 
     } 
    }); 
} 

//call also loadMap with a callback to know when all zip are resolved 
loadMap(function() { 
    console.dir(citymap); //all done! 
});