我遇到了与第三方API的同步问题。
我的“for循环”似乎运行得很快,抛弃了API请求 可以按任何顺序返回数据。
如何对其进行重组以确保DoSomething同步运行?
function startgeocoding() {
for(var x = 0; x < address2.length; x++ ) {
geocode(address);
}
}
function geocode(address) {
if (geocoder) {
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
DoSomething();
}
}
}
答案 0 :(得分:2)
您可以在成功回调中的下一个元素上调用geocode()
来创建一系列调用。这些调用仍然是异步的,但在第一个完成之前,您不会对下一个调用进行地理编码。类似的东西:
var addresses = [];
// this function really is optional, it's just copying an array
function startGeocoding() {
for (var x = 0; x < addresses2.length; x++) {
addresses.push(addresses2[x]);
}
geocode(addresses.shift());
}
function geocode(address) {
if (geocoder){
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
DoSomething();
if (addresses.length > 0) {
// take first value
geocode(addresses.shift());
}
}
});
}
}
另一种选择可能是保留它的方式,但排队结果,以某种方式对它们进行排序,然后在按照你希望的顺序完成所有同步调用后再对它们进行处理。