仅当循环内完成异步调用时才输出

仅当循环内完成异步调用时才输出

问题描述:

我正在使用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

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

好吧,我明白现在是异步的,如何检测所有的呼叫是否完成? –