如何重新构建此 for 循环,以便在异步 api 调用完成之前不会进行下一次迭代
How to re-structure this for loop so the next iteration doesn't happen until an asynchronous api call completes
所以下面我们有学校一个数组,比如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
})
}
我需要在回调函数中使用键/org_code,但显然 for 循环的迭代速度比地理编码 api 调用完成的速度快,因此在回调函数中使用了不正确的键。
我尝试使用 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) {
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))
}
使用递归函数。要获取密钥 - 重新格式化学校数组。
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);
相关文章:
- 当接收到AJAX内容时,每次$.的下一次迭代
- 为什么这个 JavaScript switch 语句(在 for 循环内)保留了上一次迭代的值
- 异步mongodb更新循环中最后一次迭代后的重定向
- 如何在当前迭代中获得下一次迭代的值
- 如何重新构建此 for 循环,以便在异步 api 调用完成之前不会进行下一次迭代
- 变量在循环的最后一次迭代中变为未定义
- 对于下一次迭代之前的循环延迟
- 为什么这个简单的.js在一次迭代后循环停止
- 在使用 CasperJS 遍历参数化 URL 时,仅执行最后一次迭代
- 每次单击一次迭代两个数组并制作动画
- Javascript/Angularjs :等待承诺实现,然后再进入foreach Loop中的下一次迭代
- JSTL:如何获取Map的上一次和下一次迭代元素
- 在下一次迭代之前暂停对JSON对象进行迭代
- 如何知道回调循环的哪一次迭代以及何时执行
- Javascript-只用于循环打印最后一次迭代
- 获取jquery each中的最后一次迭代
- 只进行最后一次迭代的循环内函数调用
- 在第一个数组的下一次迭代之前,遍历一个数组并连接另一个数组的所有值
- 在for循环的每一次迭代中都会计算.length属性
- jQuery - 如何滚动浏览子类 addclass 然后在一次迭代中删除类 setTimout 不起作用