Javascript 如何重新构造这个for循环,以便下一次迭代不会';在异步api调用完成之前不会发生

Javascript 如何重新构造这个for循环,以便下一次迭代不会';在异步api调用完成之前不会发生,javascript,Javascript,下面是school[key]=value这样的数组 for(key in schools) { geocoder = new google.maps.Geocoder(); var address = schools[key]; var org_code = key; geocoder.geocode({ 'address': address}, function(results, status) { //

下面是school[key]=value这样的数组

for(key in schools) {
        geocoder = new google.maps.Geocoder();
        var address = schools[key];
        var org_code = key;
        geocoder.geocode({ 'address': address}, function(results, status) {
             //callback function
        })
}
我需要在回调函数中使用key/org_代码,但是for循环的迭代速度明显快于geocodeapi调用的完成速度,因此回调函数中使用了错误的键

我尝试使用array.shift将上述内容重写为函数,并在回调中使用该函数,但我无法做到。。。首先,我无法使用该方法访问密钥。

您可以使用闭包:

for(key in schools) {
    (function(key) {
        geocoder = new google.maps.Geocoder();
        var address = schools[key];
        var org_code = key;
        geocoder.geocode({ 'address': address}, function(results, status) {
            //callback function
        })
    })(key)
}
您可以使用闭包:

for(key in schools) {
    (function(key) {
        geocoder = new google.maps.Geocoder();
        var address = schools[key];
        var org_code = key;
        geocoder.geocode({ 'address': address}, function(results, status) {
            //callback function
        })
    })(key)
}

使用立即调用的函数表达式创建闭包,为每个迭代确定变量的范围:

for (key in schools) {
    geocoder = new google.maps.Geocoder();
    var address = schools[key];
    var org_code = key;
    (function(address, org_code) {
        geocoder.geocode({
            'address': address
        }, function (results, status) {
            //callback function
        })
    })(address, org_code);
}

使用立即调用的函数表达式创建闭包,为每个迭代确定变量的范围:

for (key in schools) {
    geocoder = new google.maps.Geocoder();
    var address = schools[key];
    var org_code = key;
    (function(address, org_code) {
        geocoder.geocode({
            'address': address
        }, function (results, status) {
            //callback function
        })
    })(address, org_code);
}

另一个使用闭包的建议是:

for(key in schools) {
    geocoder = new google.maps.Geocoder();
    var address = schools[key];
    var org_code = key;
    geocoder.geocode({ 'address': address }, function(org_code, address) {
        return function (results, status) {
            // use address and org_code here
        };
    }(org_code, address))
}

另一个使用闭包的建议是:

for(key in schools) {
    geocoder = new google.maps.Geocoder();
    var address = schools[key];
    var org_code = key;
    geocoder.geocode({ 'address': address }, function(org_code, address) {
        return function (results, status) {
            // use address and org_code here
        };
    }(org_code, address))
}

使用递归函数。获取密钥-重新格式化学校数组

var geocoder = new google.maps.Geocoder();

function geocodeNext(sch) {
  var item = sch.shift();
  var address = item['address'];
  var key = item['key'];
  geocoder.geocode({ 'address': address}, function(results, status) {
    //do something with key
    geocodeNext(sch);
  })
}

var schools1 = [];
for var (key in schools) {
  schools1.push({'address': schools[key], 'key': key});
}

geocodeNext(schools1);

使用递归函数。获取密钥-重新格式化学校数组

var geocoder = new google.maps.Geocoder();

function geocodeNext(sch) {
  var item = sch.shift();
  var address = item['address'];
  var key = item['key'];
  geocoder.geocode({ 'address': address}, function(results, status) {
    //do something with key
    geocodeNext(sch);
  })
}

var schools1 = [];
for var (key in schools) {
  schools1.push({'address': schools[key], 'key': key});
}

geocodeNext(schools1);

非常好,干净的溶液。非常好,干净的溶液。