Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-与第三方API的同步问题_Javascript_Api_Closures - Fatal编程技术网

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

JavaScript-与第三方API的同步问题,javascript,api,closures,Javascript,Api,Closures,我与第三方API存在同步问题 我的“for循环”似乎运行得很快,抛出了API请求 它可以以任何顺序返回数据 我如何重构它来忍受DoSomething是同步运行的 function startgeocoding() { for(var x = 0; x < address2.length; x++ ) { geocode(address); } } function geocode(address) { if (geocoder) {

我与第三方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();
        }
    }
}
函数启动geocoding(){
对于(var x=0;x
您可以在成功回调的下一个元素上调用
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());
                }
            } 
        });
    }
}
var地址=[];
//这个函数实际上是可选的,它只是复制一个数组
函数startGeocoding(){
对于(var x=0;x0){
//取第一值
地理编码(addresses.shift());
}
} 
});
}
}

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

+1 damn对队列有相同的想法,但您的速度快了10倍:/