JavaScript - 与第三方API的同步问题

时间:2012-01-27 14:38:44

标签: javascript api closures

我遇到了与第三方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();
        }
    }
}

1 个答案:

答案 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());
                }
            } 
        });
    }
}

另一种选择可能是保留它的方式,但排队结果,以某种方式对它们进行排序,然后在按照你希望的顺序完成所有同步调用后再对它们进行处理。