2011-08-25 33 views
0

我試圖使用jQuery when函數,爲了等到一個Ajax請求完成,然後再繼續前進,但是顯然出錯了。jQuery推遲不工作對我?

我的控制檯輸出看起來是這樣的:

geocodeMaster 
geocode Canary Wharf 
Object 
geocode 
Object 
address is blank, returning 51.501885 -0.190894 
proceeding 
Uncaught TypeError: Cannot read property '0' of undefined 
Object 
Object 

最後兩個對象是從第二個呼叫到geocode輸出。爲什麼代碼在第二次調用的輸出之前顯示proceeding

我的代碼如下所示:

function geocode(address, geodata) { 
    console.log('geocode', address, geodata); 
    geodata['street'] = address; 
    if (address=="") { 
     console.log('address is blank, returning ' + current_latlng[0], current_latlng[1]); 
     return [current_latlng[0], current_latlng[1]]; 
    } 
    $.ajax({ 
     url: CS_API + 'geocoder.json', 
     data: geodata, 
     dataType: 'jsonp', 
     jsonpCallback: 'places', 
     success: function(from_data) { 
      console.log(from_data); 
      if (from_data.results.result!=undefined){ 
       var from_result = from_data.results.result; 
       console.log(from_result) 
       return [from_result.latitude, from_result.longitude]; 
      } else { 
       return false; 
      } 
     }, 
     error: function(data) { 
      return false; 
     } 
    }); 
} 
function geocodeMaster(place_from,place_to) { 
    console.log('geocodeMaster'); 
    geodata['key'] = CS_API_KEY; 
    if (current_latlng!=null) { 
     geodata['n'] = current_latlng[0] + 0.1; 
     geodata['e'] = current_latlng[1] + 0.1; 
     geodata['s'] = current_latlng[0] - 0.1; 
     geodata['w'] = current_latlng[1] - 0.1; 
    } 
    var start_coords,finish_coords; 
    $.when(start_coords=geocode(place_from,geodata),finish_coords=geocode(place_to,geodata)).then(function(){ 
console.log('proceeding'); 
     console.log(start_coords[0],start_coords[1],finish_coords[0],finish_coords[1]); 
    });  
} 

那是提供給when()對象的問題不是遞延對象?如果是這樣,我怎麼能讓他們進入延期對象,同時保持我需要收集的信息 - start_lat等?

回答

0

您必須從地理編碼功能返回延遲對象。嘗試:

return $.ajax(.. 

不能直接存儲返回值到值(它不工作,現在是寫的方式)。你必須把它們存儲在其他地方,這樣調用時只需讀取行:

$.when(geocode(place_from,geodata),geocode(.... 

爲了解決這個問題,你可以通過地理編碼一個空的對象,並有功能保存其結果是,對例如:

var start_coords = {}; 
var finish_coords = {}; 
$.when(geocode(place_from,geodata,start_coords),geocode(place_to,geodata,finish_coords) ... 
+0

我很想把它包裝在一個函數中,否則我會重複所有代碼給Ajax geocoder兩次,這並不理想。這是否有可能? – Richard

+0

查看我的上次編輯。 –

+0

非常感謝! – Richard