2016-05-23 142 views
0

我正在使用Google放置API並嘗試獲取placeTable的值。當我試圖在最後更新變量是空的。僅當循環內完成異步調用時才輸出

var placeTable; 

function callback(results, status) { 

    if (status == google.maps.places.PlacesServiceStatus.OK) { 

     for (var i = 0; i < results.length; i++) { 

      var request = { placeId: results[i].place_id }; 

      service.getDetails(request, callbacks); 

      placeTable = "<table>"; 

      function callbacks(place, status) { 
       if (status == google.maps.places.PlacesServiceStatus.OK) { 
        placeTable += "<tr><td>" + place.name + "</td><td>" + place.vicinity + "</td></tr>"; 
       } 
      } 
      container.innerHTML += placeTable + "</table>"; 
     } 

    } 
} 

更新: 與所有的輸入我能調整我的代碼和計數的響應。

function callback(results, status) { 

    if (status == google.maps.places.PlacesServiceStatus.OK) { 

     var j = 0; 
     var placeTable = "<table>"; 

     for (var i = 0; i < results.length; i++) { 

      var request = { placeId: results[i].place_id }; 

      service.getDetails(request, callbacks); 

      function callbacks(place, status) { 
       if (status == google.maps.places.PlacesServiceStatus.OK) { 

        j++; 

        placeTable += "<tr><td>" + place.name + "</td><td>" + place.vicinity + "</td></tr>"; 

        if(results.length === j){ 

        container.innerHTML += placeTable + "</table>"; 

        } 
       } 
      } 
     } 

    } 
} 
+2

將所有的'placeTable'代碼回調的內部。如果你需要多個請求,那麼在你的回調中保存所有的placeTable調用,並且一旦你達到了發送請求的數量(並且得到相同數量的響應),你可以寫所有的東西。您不能指望異步調用使用非異步代碼。 – h2ooooooo

回答

3

callbacks可能在未來某個時候被調用。所以你的行:

container.innerHTML += placeTable + "</table>"; 

callbacks功能被調用之前正在執行。

UPDATE:重構的代碼:

function callback(results, status) { 
    if (status != google.maps.places.PlacesServiceStatus.OK) { 
     return; 
    } 

    var placeTable = "<table>"; 
    var detailsDone = 0; 

    function callbacks(place, status) { 
     detailsDone += 1; 

     if (status == google.maps.places.PlacesServiceStatus.OK) { 
      placeTable += "<tr><td>" + place.name + "</td><td>" + place.vicinity + "</td></tr>"; 
     } 

     if (detailsDone >= results.length) { 
      container.innerHTML += placeTable + "</table>"; 
     } 
    } 

    for (var i = 0; i < results.length; i++) { 
     service.getDetails({ 
      placeId: results[i].place_id 
     }, callbacks); 
    } 
} 
+0

這裏不叫? service.getDetails(request,callbacks); –

+1

不,'service.getDetails(request,callbacks)''只註冊你的'callbacks'函數,API收集並準備數據後調用。這將在稍後發生。就像你會使用'setTimeout'一樣,例如'setTimeout(callbacks,0)'。 – ahwayakchih

+0

好吧,我明白現在是異步的,如何檢測所有的呼叫是否完成? –