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

时间:2016-05-23 14:02:24

标签: javascript

我正在使用Google Places 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>";

                  }
              }
            }
        }

    }
}

1 个答案:

答案 0 :(得分:3)

callbacks可能会在将来的某个时间被调用。所以你的行:

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

在调用callbacks函数之前执行。

更新:重构代码:

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);
    }
}