Javascript 如何重新构造这个for循环,以便下一次迭代不会';在异步api调用完成之前不会发生
下面是school[key]=value这样的数组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) { //
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);
非常好,干净的溶液。非常好,干净的溶液。