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

Javascript 仅当异步调用在循环内完成时输出,javascript,Javascript,我正在使用GooglePlacesAPI并尝试获取placeTable的值。当我尝试在末尾更新时,变量为空 var placeTable; function callback(results, status) { if (status == google.maps.places.PlacesServiceStatus.OK) { for (var i = 0; i < results.length; i++) { var reques

我正在使用GooglePlacesAPI并尝试获取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>";
        }

    }
}
var-placeTable;
函数回调(结果、状态){
if(status==google.maps.places.PlacesServiceStatus.OK){
对于(var i=0;i
更新: 通过所有的输入,我能够调整代码并计算响应

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>";

                  }
              }
            }
        }

    }
}
函数回调(结果、状态){
if(status==google.maps.places.PlacesServiceStatus.OK){
var j=0;
var placeTable=“”;
对于(var i=0;i
回调
可能在将来的某个时候调用。所以你的台词是:

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

回调
将来可能会被调用。所以你的台词是:

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

将所有
placeTable
代码放在回调函数中。如果需要多个placeTable调用,则将所有placeTable调用保存在回调中,一旦达到发送的请求数量(并得到相同数量的响应),就可以编写所有内容。您不能期望异步调用与非异步代码一起工作。请将所有
placeTable
代码放在回调中。如果需要多个placeTable调用,则将所有placeTable调用保存在回调中,一旦达到发送的请求数量(并得到相同数量的响应),就可以编写所有内容。您不能期望异步调用与非异步代码一起工作。这里不调用它吗?获取详细信息(请求、回调);否,
service.getDetails(请求、回调)
仅注册
回调函数,以便API在收集和准备数据后调用。那将在以后某个时候发生。就像您将使用
setTimeout
来代替,例如
setTimeout(callbacks,0)
。好的,我知道它现在是异步的,我如何检测是否所有调用都已完成?您已经知道有多少位置需要详细信息。保留一些变量,以便在调用
回调时更新。当该变量的值变为等于位数时,您将知道所有这些变量都调用了该变量。我没有测试它,所以它可能包含bug,但它只是告诉您可以尝试使用代码的方式。我可能会对它做更多的更改,接受回调并使用生成的HTML块调用它(甚至只是一个包含数据的数组,并让调用者从中生成HTML),而不是直接从这个函数更改DOM。这里不调用它吗?获取详细信息(请求、回调);否,
service.getDetails(请求、回调)
仅注册
回调函数,以便API在收集和准备数据后调用。那将在以后某个时候发生。就像您将使用
setTimeout
来代替,例如
setTimeout(callbacks,0)
。好的,我知道它现在是异步的,我如何检测是否所有调用都已完成?您已经知道有多少位置需要详细信息。保留一些变量,以便在调用
回调时更新。当该变量的值变为等于位数时,您将知道所有这些变量都调用了该变量。我没有测试它,所以它可能包含bug,但它只是告诉您可以尝试使用代码的方式。我可能会对它做更多的更改,接受回调并使用生成的HTML块调用它(甚至只是一个包含数据的数组,并让调用者从中生成HTML),而不是直接从这个函数更改DOM。