仅当循环内完成异步调用时才输出
我正在使用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>";
}
}
}
}
}
}
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);
}
}
这里不叫? service.getDetails(request,callbacks); –
不,'service.getDetails(request,callbacks)''只注册你的'callbacks'函数,API收集并准备数据后调用。这将在稍后发生。就像你会使用'setTimeout'一样,例如'setTimeout(callbacks,0)'。 – ahwayakchih
好吧,我明白现在是异步的,如何检测所有的呼叫是否完成? –
将所有的'placeTable'代码回调的内部。如果你需要多个请求,那么在你的回调中保存所有的placeTable调用,并且一旦你达到了发送请求的数量(并且得到相同数量的响应),你可以写所有的东西。您不能指望异步调用使用非异步代码。 – h2ooooooo